DFS:迷宫搜索实践

简介: DFS:迷宫搜索实践

  有一个二维迷宫,n行m列,‘s’表示迷宫的起点,‘T’表示迷宫的终点,‘#’表示围墙,‘.’表示通路。现在从S出发,你不能穿墙,问你能否到达终点,若能将路线打印出来,若不能打印“no”

输入:

第一行输入n,m(1<n,m<1000)

接下来输入n行,每行m列的迷宫

输出:

输出迷宫路线,或“no”;

#include <iostream>
#include <string>
using namespace std;
bool b[105][105];
string a[105];
int n,m;
bool in(int x,int y){
  return x>=0 && x<n && y>=0 && y<m;
}
bool dfs(int x,int y){
  int tx,ty;
//判断是否到达整点
  if(a[x][y]=='t'){
    return true;
  }
//b用来标记是否遍历,a用来标记路线
  b[x][y]=1;
  a[x][y]='+';
//接下来四个转向
  tx=x-1;
  ty=y;
  if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
    if(dfs(tx,ty)){
      return true;
    }
  }
  tx=x;
  ty=y-1;
  if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
    if(dfs(tx,ty)){
      return true;
    }
  }
  tx=x+1;
  ty=y;
  if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
    if(dfs(tx,ty)){
      return true;
    }
  }
  tx=x;
  ty=y+1;
  if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
    if(dfs(tx,ty)){
      return true;
    }
  }
  b[x][y]=0;
  a[x][y]='.';
  return false;
}
int main(){
  int x,y;
  cin>>n>>m;
    //输入迷宫
  for(int i=0;i<n;i++){   
    cin>>a[i];
  }
    //寻找起始点s
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(a[i][j]=='s'){
        x=i;
        y=j;
      }
    }
  }
  cout<<"---------------"<<endl;
    //判断是否有正确路线
  if(dfs(x,y)){
    for(int i=0;i<n;i++){
      cout<<a[i]<<endl;
    } 
  }
  else{
    cout<<"no";
  }
  return 0;
} 

运行结果如下:

该方法代码冗杂,其四个移动方向可以用一个循环代替:

#include <iostream>
#include <string>
using namespace std;
bool b[105][105];
string a[105];
int e[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int n,m;
bool in(int x,int y){
  return x>=0 && x<n && y>=0 && y<m;
}
bool dfs(int x,int y){
  int tx,ty;
  if(a[x][y]=='t'){
    return true;
  }
  b[x][y]=1;
  a[x][y]='+';
  for(int i=0;i<4;i++){
    tx=x+e[i][0];
    ty=y+e[i][1];
    if(in(tx,ty) && a[tx][ty]!='*' && !b[tx][ty]){
      if(dfs(tx,ty)){
        return true;
    }
  }
  }
  b[x][y]=0;
  a[x][y]='.';
  return false;
}
int main(){
  int x,y;
  cin>>n>>m;
  for(int i=0;i<n;i++){
    cin>>a[i];
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(a[i][j]=='s'){
        x=i;
        y=j;
      }
    }
  }
  cout<<"---------------"<<endl;
  if(dfs(x,y)){
    for(int i=0;i<n;i++){
      cout<<a[i]<<endl;
    } 
  }
  else{
    cout<<"no";
  }
  return 0;
} 

整两中本质是一样的,因此时间复杂度都是一样的,但后者代码量少一些。

相关文章
【C++】递归,搜索与回溯算法入门介绍和专题一讲解
【C++】递归,搜索与回溯算法入门介绍和专题一讲解
|
5月前
|
算法 Python
蓝桥杯-搜索BFS+DFS
蓝桥杯-搜索BFS+DFS
36 2
|
6月前
|
存储 机器学习/深度学习 算法
搜索(DFS与BFS):
搜索(DFS与BFS):
43 0
搜索(DFS与BFS):
|
12月前
|
C++
DFS之连通性问题+搜索顺序
DFS之连通性问题+搜索顺序
50 0
|
算法 UED
【算法入门&搜索法】走迷宫|单源最短路径1
【算法入门&搜索法】走迷宫|单源最短路径1
190 0
|
算法 Python
基于python实现深度优先遍历搜索(DFS)
基于python实现深度优先遍历搜索(DFS)
448 0
基于python实现深度优先遍历搜索(DFS)
|
机器学习/深度学习 数据采集 算法
搜索与图论-DFS
搜索与图论-DFS
|
存储 机器学习/深度学习 算法
搜索与图论-BFS
搜索与图论-BFS
【算法手札】深入理解宽度遍历(bfs)和深度遍历(dfs)搜索
【算法手札】深入理解宽度遍历(bfs)和深度遍历(dfs)搜索
【算法手札】深入理解宽度遍历(bfs)和深度遍历(dfs)搜索
|
定位技术