您的位置:首页 > 编程语言 > PHP开发

POJ-2969 the pilots brothers' refridgerator

2011-09-04 19:40 106 查看
可以高斯消元,但是我不会 :(

/*
* POJ-2965 the pilots brothers' refrigerator
* mike-w
* 2011-9-4
* creativewang@163.com
* hint: DFS
*/
#include<stdio.h>
#include<stdlib.h>

long board;
long open=0x0000;
long min=0xffff;
long rec;
long ans;
long c[20]={
0x0000,
0xf888,0xf444,0xf222,0xf111,
0x8f88,0x4f44,0x2f22,0x1f11,
0x88f8,0x44f4,0x22f2,0x11f1,
0x888f,0x444f,0x222f,0x111f
};

int getData(void)
{
char ch;
while((ch=getchar())!=EOF)
if(ch=='-')
board<<=1;
else if(ch=='+')
board|=0x1,board<<=1;
board>>=1;
return 0;
}

/*
* n: 搜索深度
* board: 状态
* op: 已完成操作数
*/
int search(int n,long board,int op)
{
if(op>=min)
return 0;
if(n>16)
{
if(board==open && op<min)
min=op,ans=rec;
return 0;
}

rec<<=1;
search(n+1,board,op);
rec>>=1;

rec|=1;
rec<<=1;
search(n+1,board^c
,op+1);
rec>>=2;
rec<<=1;

return 0;
}

int output(void)
{
printf("%ld\n",min);
ans>>=1;
/*	printf("ans=%ld\n",ans);	*/
int i,j,p=1<<15;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++,p>>=1)
if(ans&p)
printf("%d %d\n",i,j);
p>>=1;
return 0;
}

int main(void)
{
#ifndef ONLINE_JUDGE
freopen("1965.in","r",stdin);
#endif
getData();
search(1,board,0);
output();
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  search output c