试题 算法提高 八数码(bfs)
问题描述
RXY八数码
输入格式
输入两个3*3表格
第一个为目标表格
第二个为检索表格
第一个为目标表格
第二个为检索表格
输出格式
输出步数
样例输入
1 2 3
4 5 6
7 8 0
1 2 3
4 5 6
7 0 8
4 5 6
7 8 0
1 2 3
4 5 6
7 0 8
样例输出
1
数据规模和约定
3*3*2
思路
经典搜索问题,记录九个格子为空格时可以交换的格子,bfs注意开一个临时变量进行交换,得到目标情形跳出即可。
#include<bits/stdc++.h>
using namespace std;
int dir[9]={2,3,2,3,4,3,2,3,2};
int dis[9][4]={{1,3},{0,2,4},{1,5},{0,4,6},{1,3,5,7},{2,4,8},{3,7},
{4,6,8},{5,7}};
int getpos(string a){
for(int i=0;i<a.size();i++){
if(a[i]=='0')return i;
}
}
int main(){
string a,b;
int temp;
string a1[9],a2[9];
for(int i=0;i<9;i++){///处理一下输入string遇回车结束
cin>>a1[i];
a+=a1[i];
}
for(int i=0;i<9;i++){
cin>>a2[i];
b+=a2[i];
}
queue<pair<string,int> >q;///存储字符串和步数
q.push(make_pair(a,0));
while(!q.empty()){
string str=q.front().first;
int step=q.front().second;
q.pop();
int pos=getpos(str);///得到空格的位置
if(str==b){
cout<<step<<endl;
break;
}
for(int i=0;i<dir[pos];i++){
string temp=str;
swap(temp[pos],temp[dis[pos][i]]);
q.push(make_pair(temp,step+1));
}
}
return 0;
}