一个不错的Bfs,它的价值在于状态的保存,做这道题就是为了学习如何用位存储状态。虽然看了网上的思路,也算入了门吧!
题目的意思: 给定一个4*4格的棋盘,每一个格子是黑的或者白的,现在有一个规则:每当把一个格子变成它相反的颜色,那么相邻的格子(上下左右)的颜色也将变成它与原来相反的颜色。那么,给出一种算法,对于一个给定的棋盘,把它的格子全部变成白色或黑色。
直接BFs就可以,其中关键是状态的保存,可以用1表示黑色,0表示白色。则一个状态可以用16位2进制表示,当然如何获得下一个状态呢,可以用位用算法符,^(异或)取反, <<( 左移)来产生新的状态。
Source Code
Problem: 1753 User: zhouxc
Memory: 396K Time: 141MS
Language: C++ Result: Accepted
Source Code
#include "iostream"
#include "queue"
using namespace std;
typedef struct State{
int step;
int state;
};
State s,temp,t;
char map[4][4];
bool hash[70000];
void Move(int r)
{
t.state^=(1<<(15-r));
if(r>=4)
t.state^=(1<<(15-r+4));
if(r<=11)
t.state^=(1<<(15-r-4));
if((r%4))
t.state^=(1<<(15-r+1));
if(((r+1)%4))
t.state^=(1<<(15-r-1));
}
void Bfs()
{
queue<State> q;
bool flag=false;
hash[s.state]=true;
q.push(s);
int cunt=0;
while(!q.empty())
{
temp=q.front();
q.pop();
for(int i=0;i<16;i++)
{
t=temp;
Move(i);
if(t.state==0||t.state==65535)
{
flag=true;
cout<<t.step+1<<endl;
break;
}
if(!hash[t.state])
{
hash[t.state]=true;
t.step=temp.step+1;
q.push(t);
}
}
if(flag)
break;
}
if(!flag)
cout<<"Impossible"<<endl;
}
int main()
{
s.state=0;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
cin>>map[i][j];
if(map[i][j]=='b')
s.state+=1;
s.state<<=1;
}
s.state>>=1;
memset(hash,false,sizeof(hash));
s.step=0;
if(s.state==0||s.state==65535)
cout<<"0"<<endl;
else
Bfs();
return 0;
}