dfs 求调 有注释
查看原帖
dfs 求调 有注释
538899
jia_hua_wu楼主2023/2/27 13:19

虽然本蒟蒻知道这不是正解,但我想先把 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;
}
2023/2/27 13:19
加载中...