1,会读入数据
2,将4*4的矩阵表示成一个数,进行状态的压缩
3,熟悉位运算^,|
4,进行BFS搜索
#include<iostream>
#include<queue>#include<memory.h>
#include<stdio.h>
using namespace std;
#define MaxValue 1<<16
bool visited[MaxValue];
char ch[4][5];
int go[][2]={{-1,0},{0,-1},{0,1},{1,0}};
int result;
bool flag=false;
struct MyNode
{
int num;
int step;
};
void BFS(int sum)
{
MyNode start,now,temp;
int tmp,i,j,nx,ny,x,y;
flag=false;
queue<MyNode> Q;
start.num=sum;
start.step=0;
Q.push(start);
while(!Q.empty())
{
now=Q.front();
Q.pop();
if(now.num==0||now.num==MaxValue-1)
{
result=now.step;
flag=true;
break;
}
for(i=0;i<16;i++)
{
tmp=now.num^(1<<i);//改变本位
x=i/4,y=i%4;
for(j=0;j<4;j++)//改变相邻的位置值
{
nx=x+go[j][0];
ny=y+go[j][1];
if(nx>=0&&nx<4&&ny>=0&&ny<4)
{
tmp^=1<<(4*nx+ny);
}
}
if(visited[tmp])
continue;
temp.num=tmp;
temp.step=now.step+1;
visited[temp.num]=true;
Q.push(temp);
}
}
}
int main(int argc,char *argv[])
{
freopen("input.txt","r",stdin);
int Tcase,i,j,sum;
scanf("%d",&Tcase);
getchar();
bool flag1=true;
while(Tcase--)
{
memset(visited,false,sizeof(visited));
getchar();
sum=0;
/*
for(i=0;i<4;i++)
{
cin.getline(ch[i],80);
}
*/
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%c",&ch[i][j]);
if(ch[i][j]=='b')
sum|=1<<(4*i+j);//求出初始状态下的sum
}
getchar();
}
/*
for(i=0;i<4;i++)
printf("%s\n",ch[i]);
puts("\n");
*/
visited[sum]=true;
BFS(sum);
if(!flag1)
cout<<endl;
if(flag1)
{
flag1=false;
}
if(flag)
cout<<result<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}