可以高斯消元,但是我不会 :(
/*
* 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[n],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;
}