题目描述
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
输入
输入初始状态,一行九个数字,空格用0表示
输出
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
样例输入
283104765
样例输出
4
提示
=================================================
#include <iostream>
#include <map>
#include <queue>
using namespace std;
int ans,sp;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
string st,d="123804765";
struct node{
string num;
int z,s;
};
queue<node> que;
map<string,bool> vis;
void bfs(){
node p0={st,sp,0};
que.push(p0);
vis[st]=true;
while(!que.empty()){
node p=que.front();
que.pop();
if(p.num==d){
ans=p.s;
return;
}
int z=p.z;
int x=z/3,y=z%3;
for(int i=0;i<4;i++){
int x2=x+dx[i],y2=y+dy[i];
if(x2>=0&&x2<3&&y2>=0&&y2<3){
int z2=x2*3+y2;
string num2=p.num;
swap(num2[z],num2[z2]);
if(vis[num2]==false){
node p2={num2,z2,p.s+1};
que.push(p2);
vis[num2]=true;
}
}
}
}
}
int main(){
cin>>st;
if(st!=d){
sp=0;
while(st[sp]!='0')
sp++;
bfs();
}
cout<<ans;
return 0;
}