迷宫 DFS 递归 解法

/*
迷宫的递归解法
比栈解法清爽的多了
DFS小应用
总体思想
DFS+条件回溯
*/
#include<iostream>
#include<string>
#include<cstring>
#define N 30
using namespace std;
int m,n,find,dir[4][2]={0,1,0,-1,1,0,-1,0};//转向控制数组
string map[N];
bool legal(int i,int j)//判断当前位置是否合法
{
	if(i>=0&&i<m&&j>=0&&j<n)
		return true;
	return false;
}
void DFS(int x,int y)//核心函数
{
	map[x][y]='o';//记录路径
	if(x==m-1&&y==n-1)//找到的话标记find为找到
	{find=1;return;}
	for(int i=0;i<4;i++)//探索四个方向
	{
		int sx=x+dir[i][0],sy=y+dir[i][1];
		if(legal(sx,sy)&&map[sx][sy]=='_')
		{
			DFS(sx,sy);
			if(!find)//根据情况进行反标记
				map[sx][sy]='_';//未找到就反标记
			else//找到的话就直接返回保存路径
				return;
		}
	}
}
int main()
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	cout<<"请按下列格式输入迷宫:"<<endl
		<<"1. '#'代表墙'_'代表可走路径"<<endl
		  <<"2. 不用输入边框"<<endl
		  <<"3. 默认为左上角为入口右下角为出口"<<endl;
	m=0;
	while(getline(cin,map[m])) m++;
	n=map[0].size();//得到迷宫的长和宽
	if(map[0][0]=='#'||map[m-1][n-1]=='#')//特殊情况处理
	{cout<<"No Solution !"<<endl;return 0;}
	find=0;//标志
	DFS(0,0);//从左上角开始搜索路径
	if(find)//找到路径情况
	{
		cout<<endl<<"一个可能的解法为:"<<endl<<endl;	
		for(int i=0;i<m;i++)
			{
				cout<<map[i]<<endl;
			}
	}
	else//未找到路径
		cout<<"No Solution !"<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值