#include "iostream" using namespace std; unsigned short int flips[16]={0xc800,0xe400,0x7200,0x3100,0x8c80,0x4e40,0x2720,0x1310, 0x08c8,0x04e4,0x0272,0x0131,0x008c,0x004e,0x0027,0x0013}; int min1=16; unsigned short int poww2(int n) { int i=1; i=i<<n; return i; } void bsp(unsigned short int number,int step,int flip) { if(number==0||number==0xffff) { min1=(min1<flip?min1:flip); return ; } if(step>=16)return; bsp(number,step+1,flip); bsp(number^flips[step],step+1,flip+1); } int main() { int i=0; unsigned short int num=0; char x; while(i<16) { cin>>x; if(x=='b') num+=poww2(15-i); i++; } min1=16; bsp(num,0,0); if(min1==16) printf("Impossible/n"); else printf("%d/n",min1); return 0; }
前两天没怎么做,卡在这道题上了,很是郁闷,觉得连这些基础的题都做不了。
后来觉得看看别人的做法,在网上看到了这位同学的博客:http://blog.sina.com.cn/s/blog_606e17490100f4n8.html
代码的思路比较清晰,比较容易看懂。
但是其中有一个问题我想了很长时间,就是为什么深度将16次作为上限。
后来在别人的帮助下终于想通了:
一共就16个格子 按17次的话 肯定有一个两次 一个格子在变换过程中按两次 相当于没按 没有意义
所以将16作为上限值。