poj 2965 The Pilots Brothers' refrigerator

http://162.105.81.212/JudgeOnline/problem?id=2965

 

跟poj 1753很像.

这两题我都是用的枚举+bfs+状态压缩,

在Discuss里看到别人说的一个很牛的方法, 如下:

开一个4X4的Bool数组,开始全为false.
如果输入(i,j)处有"+",将该行该列取反。
最后有多少true就是最少步数。输出为true的坐标就是步骤。

Code: 32MS

#include<stdio.h> int s[16]={0x111f,0x222f,0x444f,0x888f,0x11f1,0x22f2,0x44f4,0x88f8, 0x1f11,0x2f22,0x4f44,0x8f88,0xf111,0xf222,0xf444,0xf888}; int main() { char c; int i,n,j; n=i=j=0; while((c=getchar())!=EOF) if(c!=10) if(c=='+') n^=s[i++]; else i++; for(i=0;i<16;++i) if(n&(1<<i)) j++; printf("%d/n",j); for(i=0;i<16;++i) if(n&(1<<i)) printf("%d %d/n",i/4+1,i%4+1); }

 

ps:我自己的代码ms又长又臭-_-||

你可能感兴趣的:(c)