12. 迷宫问题——栈(DFS)

迷宫有一个入口,一个出口。一个人从入口走进迷宫,目标是找到出口。阴影部分和迷宫的外框为墙,每一步走一格,每格有四个可走的方向,探索顺序为地图方向:南(下)、东(右)、北(上)、西(左)。

迷宫示意图
在这里插入图片描述

输入:输入迷宫数组。第一行数据表示一个 n*n (n<=100)的迷宫;第二行开始的n行为迷宫数据。
其中:0表示路,1表示墙,起点在左上角 <1,1> 的位置,终点在右下角 <n,n> 的位置。
输出:若有解,输出从入口到出口的一条路径,否则输出 There is no solution!
例(上图所示的迷宫数组)
输入:
4 4
0 0 1 0
0 1 0 1
0 0 0 0
0 1 0 0

输出:<1,1> <2,1> < 3,1> < 3,2> < 3,3> <4,3> <4,4>

#include<stdio.h>
#include<string.h>
struct node
{
	int x,y;
};
int m,n,map[105][105],vis[105][105],dir[4][2]={-1,0,1,0,0,-1,0,1},min=1000000;
node a[10005],temp[10005];
void dfs(int t,int x,int y)
{
	if(x==m-1 && y==n-1)
	{
		if(t<min)
		{
			min=t;
			for(int i=0;i<t;i++)
				temp[i]=a[i];
		}
		return ;
	}
	for(int k=0;k<4;k++)
	{
		int px=x+dir[k][0];
		int py=y+dir[k][1];
		if(px>=0 && px<m && py>=0 && py<n && vis[px][py]==0 && map[px][py]==0)
		{
			vis[px][py]=1;
			a[t].x=px;
			a[t].y=py;
			dfs(t+1,px,py);
			vis[px][py]=0;
		}
	}
}

int main()
{
	int i,j;
	scanf("%d%d",&m,&n);
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
			scanf("%d",&map[i][j]);
	memset(vis,0,sizeof(vis));
	vis[0][0]=1;
	dfs(0,0,0);
	if(min==1000000)
	{
		printf("There is no solution!\n");
		return 0;
	}
	printf("<1,1> ");
	for(i=0;i<min;i++)
		printf("<%d,%d> ",temp[i].x+1,temp[i].y+1);
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ArgentumHook/article/details/83352897