竞赛
考级
#include<stdio.h> int main(void) { char a[101][101]; int sum[100][100]={0}; int j,i,n,m; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%s",a[i]);getchar(); } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(a[i][j]'*') {sum[i][j]=-1; continue; } if(a[i-1][j-1]'') sum[i][j]++; if(a[i-1][j]=='') sum[i][j]; if(a[i-1][j+1]=='*') sum[i][j]; if(a[i][j-1]'*') sum[i][j]++; if(a[i][j+1]'') sum[i][j]++; if(a[i+1][j-1]=='') sum[i][j]; if(a[i+1][j]=='*') sum[i][j]; if(a[i+1][j+1]=='') sum[i][j]; } } for(i=0;i<n;i) { for(j=0;j<m;j++) { if(sum[i][j]!=-1) printf("%d",sum[i][j]); else putchar(''); } putchar('\n'); } return 0; }
#include<iostream> using namespace std; int main(){ int n,m,b[1005][1005],x[10]={-1,-1,-1,0,0,1,1,1},y[10]={-1,0,1,-1,1,-1,0,1}; char a[1005][1005]; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]'*'){ for(int k=0;k<=7;k++){ b[i+x[k]][j+y[k]]; } } } } for(int i=1;i<=n;i){ for(int j=1;j<=m;j++){ if(a[i][j]''){ cout<<''; }else{ cout<<b[i][j]; } } cout<<endl; } return 0; }
#include<bits/stdc++.h> using namespace std; char a[105][105]; string b[105]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>b[i]; for(int j=0;j<m;j++) if(b[i][j]'') a[i][j+1]=''; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]!='*') { a[i][j]='0'; if(a[i-1][j-1]'') a[i][j]++; if(a[i][j-1]=='') a[i][j]; if(a[i-1][j]=='*') a[i][j]; if(a[i+1][j-1]'*') a[i][j]++; if(a[i-1][j+1]'') a[i][j]++; if(a[i+1][j]=='') a[i][j]; if(a[i][j+1]=='*') a[i][j]; if(a[i+1][j+1]=='*') a[i][j]; } } } for(int i=1;i<=n;i) { for(int j=1;j<=m;j++) cout<<a[i][j]; cout<<endl; } return 0; }
不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!不要写else if!!!
本题是经典的扫雷游戏模拟题,核心在于对每个非雷格(?)统计其周围 8 个方向的地雷(*)数量。 我的解法严格遵循题目要求: 1. 输入处理:首先读入雷区的行数 n 和列数 m,然后逐行读取地图字符串,存储为列表 rows。 2. 逐格判断:遍历每个位置 (y, x): * 若当前格为地雷(*),直接在结果中保留 *; * 若为安全格(?),则进入统计流程。 3. 邻域构建:动态计算上下左右四个方向的有效坐标(通过边界检查 >=0 和 < 行/列数),分别存入 directions_ud(上下行)和 directions_lr(左右列)。 4. 八方扫描:将当前行列加入邻域列表,形成最多 3×3 的局部区域,遍历其中每个格子,遇到 * 则计数加一。 5. 类型转换:关键细节——必须将计数值 count 转为字符串再存入结果,否则后续 ''.join() 会因类型错误而崩溃! 虽然未使用方向数组等简洁写法,但逻辑清晰、边界处理稳妥,能正确应对各种角落与边缘情况。一行不偷懒,八方皆扫清,这才是扫雷的正确打开方式!
#include<bits/stdc++.h> using namespace std; int main(){ int n,m; char s[105][105]; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>s[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int num=0; if(s[i][j]''){ cout<<""; }else{ if(s[i+1][j]''){ num++; } if(s[i][j+1]==''){ num++; } if(s[i-1][j]'*'){ num++; } if(s[i][j-1]''){ num++; } if(s[i+1][j+1]==''){ num++; } if(s[i-1][j-1]'*'){ num++; } if(s[i-1][j+1]''){ num++; } if(s[i+1][j-1]==''){ num++; } cout<<num; } } cout<<endl; } return 0; }
Qweetzzjfjkdnngorle
#include<bits/stdc++.h> using namespace std; const int N=110; char a[N][N]; int n,m; void Y(int x,int y){ int ans=0; if(a[x-1][y] == '') ans++; if(a[x][y-1] == '') ans++; if(a[x][y+1] == '') ans++; if(a[x+1][y] == '') ans++; if(a[x-1][y-1] == '') ans++; if(a[x+1][y-1] == '') ans++; if(a[x-1][y+1] == '') ans++; if(a[x+1][y+1] == '') ans++; cout<<ans; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i][j]!='') Y(i,j); else cout<<''; } cout<<endl; } return 0; }
共114条
提交答案之后,这里将显示提交结果~