思路:
一.主函数
- 首先输入起点与终点的位置,再输入障碍的个数。并建立一个坐标的二维数组,初始化为0
- 用for循环依次输入障碍的坐标,并将其对应的二维数组的值赋值为1
接着以起点进行深搜即dfs
二.dfs函数
- 先写出if条件语句 即不撞南墙不回头中的南墙
(1)判断是否越界
if (k<1 || k>n) return;
if (l<1 || l>m) return;
(2)判断是否为障碍物或者已经走过的格子
if (a[k][l] == 2)
return;
在此处将走过的格子等同于障碍物
(3)判断是否已到达终点
if (k == x2 && l == y2) {
sum++;
return;
}
2.如果上述条件都不符合就代表此时位置没有走过,并且不是障碍物,也不是终点处
那么
首先
让此时的坐标数组对应值为2,代表已经走过
其次
进入递归部分
dfs(k + 1, l);
dfs(k-1, l);
dfs(k, l + 1);
dfs(k, l - 1);
一层一层递归当遇到满足上述if语句的坐标时,会回到上一层,选择其他路径,以此往复。
直到最外层的四层递归都结束
最后
a[k][l]=0;
代表每结束一层递归就要使其恢复0,这样走另外一条路时也可以通过这个节点
完整代码如下:
#include <iostream>
using namespace std;
int n, m, t,x1,y1,x2,y2,z1,z2,sum=0;
int a[100][100];
void dfs(int k, int l) {
if (k<1 || k>n) return;
if (l<1 || l>m) return;
if (a[k][l] == 2)
return;
if (k == x2 && l == y2) {
sum++;
return;
}
a[k][l] = 2;
dfs(k + 1, l);
dfs(k-1, l);
dfs(k, l + 1);
dfs(k, l - 1);
a[k][l]=0;
}
int main()
{
cin >> n >> m >> t;
cin >> x1 >> y1 >> x2 >> y2;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
a[i][j] = 0;
}
}
for (int i = 1;i <= t;i++) {
cin >> z1 >> z2;
a[z1][z2] = 2;
}
dfs(x1, y1);
cout << sum;
return 0;
}