经典的bfs问题,将每个棋盘看成一个状态,从而转换为一个路径寻找问题。
用取模找0的标号坐标,假设0的位置为n
x=(n-1)/3+1, y=(n-1)%3+1;
#include #include #include #include #include #include using namespace std; int obj=123804765;//目标状态 int ans,front=1,rear=2;//用来标记前驱结点标号,然后计算距离 , int s[10]; int news[10]; int dist[1000000];//记录距离 有362880个状态。。 int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1}; set vis;//状态判重 void itoarr(int f)//编码转数组 { for(int i=9;i>=1;i--) { s[i]=f%10; //cout< q; q.push(k); while(!q.empty()) { int f=q.front(); if(f==obj)return front;//如果到达目标结点,返回该结点下标 int zpos,x,y; q.pop(); itoarr(f); for(zpos=1;zpos<=9;zpos++)//找0的位置 if(!s[zpos])break; x=(zpos-1)/3+1;y=(zpos-1)%3+1; for(int i=0;i<4;i++)//四个方向 { int newx=x+dx[i],newy=y+dy[i]; if(newx<1||newx>3||newy<1||newy>3)continue; memcpy(&news,&s,sizeof(s)); int newz=(newx-1)*3+newy; news[newz]=s[zpos]; news[zpos]=s[newz]; int nf=arrtoi(); //cout<