【DFS】迷宫问题(C++)

【题目描述】

定义一个二维数组:
int maze[5][5] = {
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

【输入】

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

【输出】

左上角到右下角的最短路径,格式如样例所示。

【输入样例】

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

【输出样例】

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

这题只需要定义两个数组,一个存当前路径,另一个存最短路径就行了。
下面是代码:

#include<bits/stdc++.h>
using namespace std;
int X[26],Y[26],a[5][5],XX[26],YY[26],Min=INT_MAX;
int xx[5]={0,0,0,1,-1};
int yy[5]={0,1,-1,0,0};
void print(int n)
{
	for(int i=1;i<=n;i++)
	{
		printf("(%d, %d)\n",XX[i],YY[i]);
	}
}
void fz(int n) {
	for(int i=1;i<=n;i++)
	{
		XX[i]=X[i];
		YY[i]=Y[i];
	}
}
void dfs(int x,int y,int sum)
{
	X[sum]=x;
	Y[sum]=y;
	if(x==4&&y==4)
	{
		Min=min(sum,Min);
		if(Min==sum)
		fz(sum);
		return ;
	}
	for(int i=1;i<=4;i++)
	{
		if(x+xx[i]>=0&&y+yy[i]>=0&&x+xx[i]<5&&y+yy[i]<5&&!a[x+xx[i]][y+yy[i]])
		{
			a[x][y]=1;
			dfs(x+xx[i],y+yy[i],sum+1);
			a[x][y]=0;
		}
	}
}
int main() {
	for(int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	dfs(0,0,1);
	print(Min);

	return 0;
}
原创文章 75 获赞 126 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liuzich/article/details/103653998