深度优先搜索算法(Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。顾名思义,就是优先向纵深方向推进、搜索。形象点来说,就是沿着一条路一直走下去,直到“撞了南墙”才回头,再走其它的路,直至所有结点都遍历完。
![](https://i-blog.csdnimg.cn/blog_migrate/402cd2f914b2a0c6286a0ad52063304f.jpeg)
这种将所有结点都遍历完的方法能很好地帮助我们求解一些问题,就比如说全排列问题或者说要求出方案总数。不过有的时候时间上的开销可不小 (小声
下面就一起来看一个比较经典的走迷宫问题吧!
https://www.luogu.com.cn/problem/P1605
先来简单分析一下题目吧!
我们可以用一个二维数组a模拟平面,再用一个数组visit来记录这个坐标是否被访问过。而对于障碍以及起点,我们可以在数组a中进行标记。不过还有一个问题:如何简便地表示平面内向四个方向的移动呢?很简单,用一个nxt数组表示位移就行啦( •̀ ω •́ )✧
至于剩下的工作,就只是按照模板写出DFS算法了
#include <bits/stdc++.h>
using namespace std;
int a[15][15], visit[15][15];
int n, m, tot;
int nxt[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; //位移数组分别对应向上、下、左、右
int sx, sy, fx, fy, t;
void dfs(int x, int y)
{
if (x == fx && y == fy)
{
tot++;
return;
}
for (int i = 0; i < 4; i++) //用i控制向上下左右移动
{
int j = x + nxt[i][0], k = y + nxt[i][1]; // 移动后的坐标为(j,k)
if (j >= 1 && j <= n && k >= 1 && k <= m && a[j][k] != 1 && visit[j][k] != 1)
//边界条件,只有当在范围内且没有被访问过才能遍历
{
visit[j][k] = 1; //进行标记
dfs(j, k);
visit[j][k] = 0; //回溯
}
}
return;
}
int main()
{
cin >> n >> m >> t;
cin >> sx >> sy >> fx >> fy;
a[sx][sy] = 1; //标记起始点
for (int i = 1; i <= t; i++)
{
int l, r;
cin >> l >> r;
a[l][r] = 1; //标记障碍点
}
dfs(sx, sy);
cout << tot;
return 0;
}