深度优先搜索概念
深搜是在所有可能中枚举所有完整路径,遍历所有可能的搜索方法。
就像在迷宫中,一直沿着右手边走,遇到死胡同就掉头,遍历所有可能的过程中找到终点。比较容易理解的是用栈来实现,因为每次走到死胡同都要走回上次选择这个分支的岔路口,遇见分支的时候把它入栈,死胡同走不了所以走回这个分支开始的岔路口之后把分支出栈,然后接着遍历分支,分支遍历完了就把这个岔路口出栈。
递归是实现dfs方式的一种,用递归解决dfs的方法比较简单,递归的临界条件就是死胡同,递归式就是我们走迷宫的约定,沿着左手走或者沿着右手走。递归函数就相当于一个系统栈。递归里的回溯相当于dfs的剪支操作,都是把不能递归下去的分支剪掉。
之前关于递归的讲解在这里,讲了经典的全排列和8皇后问题。
P1605 迷宫
#include<iostream>
using namespace std;
int n, m, t, sx, sy, fx, fy;
int ans = 0;
int obstacle[10][10];
int vis[10][10];
int direction_X[4] = { 1,0,-1,0 };
int direction_Y[4] = { 0,1,0,-1 };
void dfs(int x, int y) {
if (x == fx && y == fy) {
ans++;
return;
}
for (int i = 0; i < 4; i++) {
int cx, cy;
cx = x + direction_X[i];
cy = y + direction_Y[i];
if (cx >= 1 && cx <= n && cy >= 1
&& cy <= m && obstacle[cx][cy] != 1
&& vis[cx][cy] != 1) {
vis[cx][cy] = 1;
dfs(cx, cy);
vis[cx][cy] = 0;
}
}
}
int main() {
cin >> n >> m >> t >> sx >> sy >> fx >> fy;
while (t--) {
int x, y;
cin >> x >> y;
obstacle[x][y] = 1;
}
vis[sx][sy] = 1;
dfs(sx, sy);
cout << ans;
return 0;
}