1 条题解
-
0
#include <bits/stdc++.h> using namespace std; // [1] crr:存储原始网格(.表示荒地,#表示杂物);arr:存储每个位置周围(含自身)的杂物数量 char crr[1100][1100]; int arr[1100][1100]={}; int main(){ int n,m; // [2] n:网格行数,m:网格列数 cin>>n>>m; // [3] 读取网格的行数和列数 // [4] 读取n行m列的网格数据,存入crr数组 for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>crr[i][j]; int sum=0; // [5] sum:统计初始状态下可直接开垦的荒地数量(周围无杂物的荒地) // [6] 遍历每个位置,计算其周围(含自身)的杂物数量 for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ // 检查当前位置是否为杂物 if(crr[i][j]=='#') arr[i][j]++; // 检查上方位置是否为杂物 if(i>0 && crr[i-1][j]=='#' ) arr[i][j]++; // 检查下方位置是否为杂物 if(i<n-1 && crr[i+1][j]=='#' ) arr[i][j]++; // 检查左方位置是否为杂物 if(j>0 && crr[i][j-1]=='#' ) arr[i][j]++; // 检查右方位置是否为杂物 if(j<m-1 && crr[i][j+1]=='#' ) arr[i][j]++; // 若当前位置周围无杂物,说明是可开垦荒地,计数加1 if(arr[i][j]==0) sum++; } } int max=0; // [7] max:记录清除单个杂物后,最多能新增的可开垦荒地数量 // [8] 遍历所有杂物位置,计算清除该杂物后新增的可开垦荒地数 for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(crr[i][j]=='#'){ // 仅处理杂物位置 int sum2=0; // sum2:清除当前杂物后新增的可开垦荒地数 // 检查上方位置,若原本周围只有当前一个杂物,清除后该位置可开垦 if(i>0 && arr[i-1][j]==1) sum2++; // 检查下方位置 if(i<n-1 && arr[i+1][j]==1) sum2++; // 检查左方位置 if(j>0 && arr[i][j-1]==1) sum2++; // 检查右方位置 if(j<m-1 && arr[i][j+1]==1) sum2++; // 检查当前杂物位置本身,若清除后周围无其他杂物,该位置可开垦 if(arr[i][j]==1) sum2++; // 更新最大新增数量 max=(max >sum2 ? max :sum2); } } } // [9] 输出最终可开垦的荒地总数:初始可开垦数 + 清除单个杂物最多新增的数量 cout<<max+sum; return 0; }
- 1
信息
- ID
- 948
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者