1 条题解

  • 0
    @ 2026-1-27 21:40:51
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] n-泳池的行数;m-泳池的列数
    int n,m;
    // [2] arr数组-存储每个方格的危险系数(0-based坐标)
    int arr[100][100];
    // [3] 四个方向的偏移量(下、上、左、右)
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,-1,1};
    // [4] dp数组-存储到达(x,y)的最小危险系数;f数组-标记(x,y)是否被访问(防止重复走同一方格)
    int dp[100][100],f[100][100]={};
    
    void dfs(int x,int y){
        // 递归终止条件:到达右下角终点,直接返回
        if(x==n-1&&y==m-1) return;
        
        // 遍历四个方向的邻居方格
        for(int i=0;i<4;i++){
            int tx=x+dx[i];  // [5] 计算邻居方格的横坐标
            int ty=y+dy[i];  // [6] 计算邻居方格的纵坐标
            // 合法性判断:1.坐标在泳池范围内;2.未被访问;3.当前路径到邻居的危险系数更小(或邻居未被初始化)
            if((tx>=0&&tx<n) && (ty>=0&&ty<m) && f[tx][ty]==0 && (dp[x][y]+arr[tx][ty]<dp[tx][ty] || dp[tx][ty]==0)){
                dp[tx][ty]=dp[x][y]+arr[tx][ty];  // [7] 更新邻居的最小危险系数
                f[tx][ty]=1;  // [8] 标记邻居为已访问(防止重复进入)
                dfs(tx,ty);  // [9] 递归进入邻居方格,继续探索路径
                f[tx][ty]=0;  // [10] 回溯:标记邻居为未访问,尝试其他路径
            }
        } 
    }
    
    int main(){
        cin>>n>>m;  // [11] 读取泳池的行数n和列数m
        // 读取每个方格的危险系数
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>arr[i][j];
            } 
        }
        // 初始化起点:左上角(0,0)的危险系数为自身值
        dp[0][0]=arr[0][0];  // 修正点:原代码此处若误写为0会导致起点危险系数错误
        f[0][0]=1;  // [12] 标记起点为已访问
        dfs(0,0);  // [13] 从起点开始深度优先搜索
        
        cout<<dp[n-1][m-1];  // [14] 输出右下角终点的最小危险系数
        return 0;
    }
    
    • 1

    信息

    ID
    1282
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者