虽然本蒟蒻知道这不是正解,但我想先把 dfs 暴力代码写出来再去学正解。
不过现在 dfs 都写不出来,跪求大佬看看。
顺带问问,哪个题解容易理解
#include<bits/stdc++.h>
using namespace std;
int che[5][5];//记录棋盘状态
int X,Y;//记录初始空格位置
int n = 3,ans = 0x7fffffff;//记录答案
map<int,bool> ma;//去重
int turn(){//将二维(数组)转一维(整形)
int t = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t = t*10 + che[i][j];
return t;
}
void out(){//断点输出查看状态
for(int i=1;i<=n;i++,printf("\n"))
for(int j=1;j<=n;j++) printf("%d ",che[i][j]);
}
void dfs(int step,int x,int y){//步数,空格的 x坐标,空格 y坐标
// out();
// printf("\n");
int t = turn();
if(t == 123804765){ans = min(ans,step);return;}//找到答案,记录最小值
else{
if(ma[x]) return;//如果查找过这个状态,回溯
else ma[x] = 1;//标记状态
}
// printf("here\n");
if(x > 1){//空格向上走
swap(che[x][y],che[x-1][y]);//将空格上方数字与空格交货
dfs(step+1,x-1,y);
swap(che[x][y],che[x-1][y]);//回溯
}
if(x < n){//空格向下走
swap(che[x][y],che[x+1][y]);
dfs(step+1,x+1,y);
swap(che[x][y],che[x+1][y]);
}
if(y > 1){//空格向左走
swap(che[x][y],che[x][y-1]);
dfs(step+1,x,y-1);
swap(che[x][y],che[x][y-1]);
}
if(y < n){//空格向右走
swap(che[x][y],che[x][y+1]);
dfs(step+1,x,y+1);
swap(che[x][y],che[x][y+1]);
}
}
int main(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
scanf("%1d",&che[i][j]);
if(che[i][j] == 0) X = i,Y = j;//读取初始状态,并记录空格位置
}
// printf("%d %d\n",X,Y);
// printf("%d\n",turn());
dfs(0,X,Y);
printf("%d",ans);//输出
return 0;
}