/*
迷宫的递归解法
比栈解法清爽的多了
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;
}
迷宫 DFS 递归 解法
最新推荐文章于 2023-08-21 21:54:03 发布