这道题让我知道了算法的美丽之处。
感谢:http://blog.csdn.net/ccDLlyy/article/details/55677065?locationNum=4&fps=1位运算啊。。。总之说就是用一个 数表示一个棋盘的状态。 黑色为1白色为0;
然后进行BFS,别忘了讨论界限的情况,取反然后用book数组记录下来。就可以了
#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
int date;
int step;
};
bool book[65536],flag=0;
int bfs(int st)
{
memset(book,0,sizeof(book));
struct node head,tail;
head.date=st; head.step=0;
book[st]=1;
queue<node> que;
que.push(head);
while(!que.empty())
{
head=que.front();
que.pop();
if(head.date==0||head.date==65535)
{
printf("%d\n",head.step);
return 1;
}
for(int i=0;i<16;i++)
{
tail.date=head.date^(1<<i);
if(i%4)
{
tail.date=tail.date^(1<<(i-1));
}
if(i>3)
{
tail.date=tail.date^(1<<(i-4));
}
if(i<12)
{
tail.date=tail.date^(1<<(i+4));
}
if((i+1)%4)
{
tail.date=tail.date^(1<<(i+1));
}
if(!book[tail.date])
{
tail.step=head.step+1;
book[tail.date]=1;
que.push(tail);
}
}
}
return 0;
}
int main()
{
int st=0;
for(int i=0;i<16;i++)
{
char c;
scanf(" %c",&c);
if(c=='b')
{
st+=1<<i;
}
}
flag=bfs(st);
if(flag==0) printf("Impossible\n");
return 0;
}
一定要复习一下位运算,太神奇。