点击查看代码
#include <iostream>
using namespace std;
int N, M, T; // 地图长宽,障碍物数量
int SX, SY, FX, FY; // 起点坐标 (Start), 终点坐标 (Finish)
int mp[10][10]; // 地图数组:1代表障碍,0代表空地
int vis[10][10]; // 访问标记:1代表当前路径已走过,0代表未走过,这个数组只代表这一次搜索的标记,回溯后会清除
int ans = 0; // 记录方案总数
// 方向数组
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void dfs(int x, int y) {
// 1. 截止条件:到达终点
if (x == FX && y == FY) {
ans++;
return;
}
// 2. 遍历选择
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// 3. 检查是否越界
if (nx >= 1 && nx <= N && ny >= 1 && ny <= M) {
//如果不是障碍物并且没走过就可以走
if (mp[nx][ny] == 0 && vis[nx][ny] == 0) {
vis[nx][ny] = 1; // 【标记】:
dfs(nx, ny); // 【递归】
vis[nx][ny] = 0; // 【回溯】:撤销标记!
}
}
}
}
int main() {
// 1.输入基本信息,矩阵和起点和终点
cin >> N >> M >> T;
cin >> SX >> SY >> FX >> FY;
// 2.输入障碍物
for (int i = 0; i < T; i++) {
int ox, oy;
cin >> ox >> oy;
mp[ox][oy] = 1;
}
// 3. 启动 DFS
vis[SX][SY] = 1;
dfs(SX, SY);
cout << ans << endl;
return 0;
}