P1605迷宫

点击查看代码
#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;
}
posted @ 2026-01-04 23:33  AnoSky  阅读(23)  评论(0)    收藏  举报