题目来源:http://poj.org/problem?id=1753
题目类型:枚举 + BFS + 位运算
主要思想:由于硬币只有两种状态,所以可以用16个二进制位来存储16个硬币(unsigned short stat;)
异或运算:XOR 0^1=1 1^1=0; 用XOR来快速的flip硬币
定义flip[16]数组,flip第i个硬币时,用stat与flip[i]异或运算即可
这里BFS我们用queue实现,每flip一个硬币,就对当前状态入队列,并判断当前状态是否符合题意 即if(stat == 0x0000 || stat == 0xffff)
下次循环就从queue中pop元素,循环十六次flip,依次判断是否符合题目
核心代码:
for (i = 0;i < SIZE*SIZE; ++i)
{
cin>>c;
c == 'b'?(stat<<=1)++:stat<<=1; //注意这里的移位操作
}
while (!myqueue.empty())
{
stat=myqueue.front();
myqueue.pop();
for (i=0;i<SIZE*SIZE;++i)
{
nextstat=stat^flip[i];
if(flag[nextstat]==true)
continue;
flag[nextstat]=true;
step[nextstat]=step[stat]+1;
if(nextstat == 0x0000 || nextstat == 0xffff)
{
cout<<step[nextstat]<<endl;
return 0;
}
myqueue.push(nextstat);
}
}