按照书上的说,BFS之前那种属于是统计数目,而这次的八数码问题则是寻找状态,寻找一种我们需要的状态,在这个状态找到了之后我们就会结束整个搜索过程。
八数码问题在分析的过程中也会有树状图形解释。
那么根据之前所做的队列我们写一下
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int board1[3][3],board2[3][3],num,x,y;
bool flag[3][3]={true};
bool check()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(board1[i][j]!=board2[i][j])
{
return false;
}
}
}
return true;
}
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct node
{
int x,y;
};
int BFS(int x,int y)
{
node start,next;
start.x=x;
start.y=y;
queue <node> q;
q.push(start);
s:if(check())
{
return num;
}
else
{
while(!q.empty())
{
start=q.front();
q.pop();
num++;
for(int i=0;i<4;i++)
{
next.x=start.x+dir[i][0];
next.y=start.y+dir[i][1];
if(next.x<3&&next.x>=0&&next.y<3&&next.y>=0&&flag[next.x][next.y])
{
int temp=board1[start.x][start.y];
board1[start.x][start.y]=board1[next.x][next.y];
board1[next.x][next.y]=temp;
q.push(next);
flag[next.x][next.y]=false;
goto s;
}
}
}
}
return num;
}
int main()
{
int t,x,y;
for(cin>>t;t;t--)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cin>>board1[i][j];
if(board1[i][j]==0)
{
x=i;
y=j;
}
}
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cin>>board2[i][j];
}
}
cout<<BFS(x,y)<<endl;
}
return 0;
}
能很明显的看到之前红黑砖问题是要求遍历所有,而八数码问题只要找到最终状态就可以结束整个BFS过程。
其他的倒是没什么别的特点,和之前的红黑砖一样,利用队列+BFS就可以,至于之前练了很多递归之后的DFS会用到。
再有一点就是要灵活用全局变量,全局变量在使用的时候会非常方便,不会造成传递值和修改之类的问题。