这个走迷宫代码是怎么实现回溯的?
#include<bits/stdc++.h>
using namespace std;
int n,m;
string maze[110];//字符串数组当二维数组使用
bool vis[110][110];//把走过的路标记
bool in(int x,int y){//保证不超出地图
return 0<=x&&x<n&&0<=y&&y<m;
}
bool dfs(int x,int y){//开头判断是否到
if(maze[x][y] == 'T'){
return true;
}
vis[x][y]=1;
maze[x][y]='m';
int tx=x-1,ty=y;//上左下右逆时针搜索
if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){
if(dfs(tx,ty)){//搜前判断前面是不是墙或空有没有走过
return true;
}
}
tx=x,ty=y-1;
if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
tx=x+1,ty=y;
if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
tx=x,ty=y+1;
if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}//上下左右都不能走,取消标记回退
vis[x][y]=0;
maze[x][y]='.';
return false;//返回上一层递归
}
int main(){
cin>>n>>m;//输入地图
for(int i=0;i<n;i++){
cin>>maze[i];
}
int x,y;//先找起点
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(maze[i][j]=='S'){
x=i;y=j;
}
}
}
if(dfs(x,y)){//开始搜索
for(int i=0;i<n;i++){
cout<<maze[i]<<endl;
}
}else{
cout<<"NO"<<endl;
}
return 0;
}