时限:5000ms 内存限制:20000K 总时限:10000ms
描述
在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几步能到达目标状态(用0表示空格):
1 2 3
4 5 6
7 8 0
输入
输入一个给定的状态。
输出
输出到达目标状态的最小步数。不能到达时输出-1。
输入样例
1 2 3
4 0 6
7 5 8
输出样例
2
提示
来源
代码
#include<iostream>
#include<queue>
#include<map>
using namespace std;
queue<int>q1;
map<int,int>step;
int bs[3][3];
void isdate();
int bfs();
void init();
int canmove(int u,int dire);
int mov(int u,int dire);
int bsdate;
int dr[4]={0,1,0,-1};
int dc[4]={-1,0,1,0};
int main()
{
int num;
isdate();
init();
num=bfs();
cout<<num<<endl;
}
void isdate()
{
int i,j;
bsdate=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
cin>>bs[i][j];
bsdate=bsdate*10+bs[i][j];
}
}
}
void init()
{
q1.push(bsdate);
step[bsdate]=0;
}
int bfs()
{
int u,v,i;
while(!q1.empty())
{
u=q1.front();
q1.pop();
if(u==123456780)
{
return step[u];
}
else
{
for(i=0;i<4;i++)
{
if(canmove(u,i))
{
v=mov(u,i);
if(v==123456780)
{
return (step[u]+1);
}
if(step.count(v)==0)
{
q1.push(v);
step[v]=step[u]+1;
}
}
}
}
}
return -1;
}
int canmove(int u,int dire)
{
int i,j;
int drow,dcol;
int now[3][3];
int r,c;
for(i=2;i>=0;i--)
{
for(j=2;j>=0;j--)
{
now[i][j]=u%10;
u=u/10;
if(now[i][j]==0)
{
drow=i;
dcol=j;
}
}
}
r=drow+dr[dire];
c=dcol+dc[dire];
if(r>=0&&r<3&&c>=0&&c<3)
{
return 1;
}
else
{
return 0;
}
}
int mov(int u,int dire)
{
int i,j;
int now[3][3];
int drow,dcol;
int r,c,sum;
sum=0;
for(i=2;i>=0;i--)
{
for(j=2;j>=0;j--)
{
now[i][j]=u%10;
u=u/10;
if(now[i][j]==0)
{
drow=i;
dcol=j;
}
}
}
r=drow+dr[dire];
c=dcol+dc[dire];
now[drow][dcol]=now[r][c];
now[r][c]=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
sum=sum*10+now[i][j];
}
}
return sum;
}