深搜经典例题

基本概念

  深度优先搜索(DFS),其过程简单来说就是从每一个可能的分支出发深入到无法深入
  为止,并且每个节点只访问一次。

思路

  深搜的实质就是穷举,按照一定的顺序和不同的方法不断去尝试,最后寻找到答案,
  在不断搜索的过程中,满足条件的状态就是目的状态之一。

模板

void dfs(int x,int y)
{
 if(a[x][y]) return ;
 for(int i=0;i<4;i++){//向上下左右四个方向移动 
  int xx=x+mov1[i];
  int yy=y+mov2[i];
  if(xx<0||yy<0||xx>=sum1||yy>=sum2){//移动不能越界 
   continue; 
  }
  a[xx][yy]=1;//标记 
  dfs(xx,yy);
  a[xx][yy]=0;//走过之后取消标记 
}

例题

迷宫问题(原题)
思路:先从出发点随意找个方向走,一步一步向前试探,碰到了死胡同或者无路可走了,再看看有没有其他路可走,若还有其他路可走,选择可走的路继续试探,如果没有路可走了,就退回到上一步,以这样的方法不断退回和探索,直到找到出口为止。
代码:

#include 
#include 
#define maxn 10
using namespace std;
int n,m,t,sx,sy,fx,fy,l,r,sum;
int a[maxn][maxn],b[maxn][maxn];//a表示迷宫的地图,b用来标记 
int ax[4]={0,0,1,-1},ay[4]={-1,1,0,0};//横坐标的上下左右,纵坐标的上下左右 
void dfs(int x,int y)
{
 if(x==fx&&y==fy){//到达了终点时 
  sum++;//方案加一 
  return;//返回继续寻找 
 }
 for(int i=0;i<4;i++){
  int xx=x+ax[i];
  int yy=y+ay[i];
  if(b[xx][yy]==0&&a[xx][yy]==1)//判断之后走的路是否有障碍
  if(xx>=1&&yy>=1&&xx<=n&&yy<=m){//判断是否越界 
      b[xx][yy]=1;
      dfs(xx,yy);
      b[xx][yy]=0;//回溯一步 
     }
 }
}
int main()
{
 cin>>n>>m>>t;
 for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    a[i][j]=1; 
 cin>>sx>>sy;
 cin>>fx>>fy;
 for(int i=1;i<=t;i++){
  cin>>l>>r;
  a[l][r]=0;
 }
 a[sx][sy]=0;//将起点赋值为0 
 dfs(sx,sy);
 cout<<sum<<endl;
 return 0;
 } 

你可能感兴趣的:(c++,dfs)