1571.八数码
时限:5000ms 内存限制:20000K 总时限:10000ms
描述
在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几步能到达目标状态(用0表示空格):
1 2 3
4 5 6
7 8 0
输入
输入一个给定的状态。
输出
输出到达目标状态的最小步数。不能到达时输出-1。
10月27日第二版代码(比较简洁):
#include <iostream>
#include <queue>
#include <map>
using namespace std;
struct node
{
int a[3][3];
int zx,zy; //0的位置
int digit; //把9个数字映射成九位整数,用来判重
bool useful; //该节点是否有效
}; //无效条件:0位置越界、节点重复
node start;
queue <node> q1;
map <int, int> used;
map <int, int> step;
int walk[4][2]=
{
0, -1,
+1, 0,
0, +1,
-1, 0
};
void input();
int setdigit(node n1); //将九个格内数字组合成九位整数
int bfs();
node moveto(node cur, int i); //返回节点cur扩展的新节点next
int main()
{
input();
cout<<bfs()<<endl;
return 0;
}
void input()
{
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
cin>>start.a[i][j];
if(start.a[i][j]==0)
{
start.zx=i;
start.zy=j;
}
}
}
start.digit=setdigit(start);
//标记初始数组并入队
used[start.digit]=1;
step[start.digit]=0;
q1.push(start);
}
//将九个格内数字组合成九位整数
int setdigit(node n1)
{
n1.digit=0;
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
n1.digit*=10;
n1.digit+=n1.a[i][j];
}
}
return n1.digit;
}
int bfs()
{
no