八数码



#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值