这个算法比起bfs,他多了return的部分。多了回溯的功能。旨在解决多种路径的问题。
(主要要能先能走,才能在去周围搜)
解决的话,读入地图是和之前一样的,比较困难的部分是是搜索。
void dfs(int x ,int y)//判断合法和出界
{
if(x<0||x>=n||y<0||y>=m||vis[x][y]||mp[x][y]=='.')//先能走,才能搜索
return ;
vis[x][y]=true;//把这个点标记为已经
cnt++;
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
//这里缺少一个关于终点的判断和对路程的统计,可以根据需要自己补充
}
要先解释的是:这就是递归,如果这个点能走,那么去判断他周围的4个点,还是调用bfs,然后在用bfs同样去调用附近的4个点。
因为有回溯的功能,所以这种代码旨在解决到底有多少种方法解决问题。
这里给了一个解决能不能走到终点的问题的代码,你可以根据自己的需要进行修改,这里是将判断和搜索分开写的
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
typedef long long int ll;
const int maxn=300;
const int inf=1e7;
int n,m;
char dt[15][15];
int vis[15][15];
int flag=0;
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
bool pd(int x,int y)//判断路是否能走
{
return x>=1&&x<=n&&y>=1&&y<=m&&dt[x][y]!='*'&&vis[x][y]==0;
}
void dfs(int x,int y)
{
if(dt[x][y]=='T')//终点就退出
{
flag=1;
return ;
}
if(!pd(x,y)) return ;
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int nx=x+dir[i][0];
int ny=y+dir[i][1];
dfs(nx,ny);
}
return ;
}
int main()
{
int sx,sy;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>dt[i][j];
if(dt[i][j]=='S')
{
sx=i;
sy=j;
}
}
}
dfs(sx,sy);
if(flag==1) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}