基本概念
深度优先搜索(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 <iostream>
#include <cstring>
#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;
}