1 条题解
-
0
#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
- 上传者