深度优先搜索(DFS)
DFS (Depth First Search,又称深度优先按搜索),是一种经典的搜索算法,它针对与图与树的搜索,可以解决最大路径等问题,算法过程就是由一个点不断深入,直到遇到死路,然后回溯,继续一通到底。
我们可以通过画图理解搜索路程:
我们先找一“棵”树
我们将起点设在1,那么DFS会从1跑到2,然后4,7。
跑到死路后,我们应该回溯,回到4后,发现没有其他路,再回溯到2,发现还有5没走,走到5
然后我们回溯到1,继续向3搜索(这里是优先搜索左子树)
说完了我们来做道题:
题目描述
给定一个 N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
输入格式
第一行为三个正整数N,M,T,分别表示迷宫的长宽和障碍总数。
第二行为四个正整数 SX,SY,FX,FY,SX,SY 代表起点坐标,FX,FY 代表终点坐标。
接下来T 行,每行两个正整数,表示障碍点的坐标。
输出格式
输出从起点坐标到终点坐标的方案总数。
输入数据 1
2 2 1
1 1 2 2
1 2
输出数据 1
1
数据范围与约定
对于 100% 的数据,1≤51≤N,M≤5,1≤101≤T≤10,1≤SX,FX≤n,1≤SY,FY≤m。
代码:
#include<bits/stdc++.h>
using namespace std;
int tx,ty,ans,a[6][6],vis[6][6],n,m;
int dx[] = {0,-1,0,0,1};
int dy[] = {0,0,-1,1,0};
void dfs(int x,int y){
if(x == tx && y == ty){ //当走到终点,方案数加一
ans++;
return;//返回
}
for(int i = 1;i <= 4;i++){
int nx = x+dx[i],ny = y+dy[i]; //向上下左右走一步(比如dx的第1项-1,dy的第1项0,就是x坐标-1,y坐标+0,表示下一行)
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && !a[nx][ny] && !vis[nx][ny]){//如果没有越界或者没有走过这个点,进行深搜
vis[nx][ny] = 1;//标记点
dfs(nx,ny);
vis[nx][ny] = 0;//清理现场(回溯)
}
}
}
int main(){
int t,sx,sy;
cin>> n >> m >> t >> sx >> sy >> tx >> ty;
int fx,fy;
for(int i = 1;i <= t;i++){
cin>> fx >> fy;
a[fx][fy] = 1; //障碍标记
}
vis[sx][sy] = 1;//将起点标记
dfs(sx,sy);//深搜
cout<< ans;
return 0;
}