题意
在已知地雷出现位置的情况下,得到各个方块中的数据
多组数据
第一行m,n(0<m,n<100)表示游戏中雷区的范围为m×n。
接下来m行每行有n个字符。“*” 表示有地雷,“.”表示无地雷。
最后一组数据m=0,n=0表示输入结束,不需要处理。
思路
两个二维数组(char型),一个input[][]储存输入的图形,一个ans[][]存放输出的图形(初始值为'0'
)
逐一遍历input:
如果是雷,ans中相应位置标记为雷,并把周围九宫格内非雷区域的值都+1
不是雷就跳过
笔记
- Presentation Error 每个输出图之间要有一个空行
代码
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
char input[100][100], ans[100][100];
int m, n;
bool flag(char ans[][100], int i, int j){
if(i<0 || j<0 || i>=m || j>=n)
return false;
if(ans[i][j]=='*')
return false;
return true;
}
void change(char ans[][100], int i, int j){
//遍历以i,j为中心点的九宫格,逐一修改九宫格中的每个值
for(int temp_i=i-1; temp_i<=i+1; temp_i++){
for(int temp_j=j-1; temp_j<=j+1; temp_j++){
if(flag(ans, temp_i, temp_j))//判断该位置是否可以改变值(雷和越界不需要改变)
ans[temp_i][temp_j]++;
}
}
}
int main(){
scanf("%d%d", &m, &n);
getchar();
while(m!=0 && n!=0){
for(int i=0; i<m; i++)
gets(input[i]);
memset(ans, '0', sizeof(ans));
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(input[i][j] == '*'){
ans[i][j] = '*';
change(ans, i, j);
}
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++)
printf("%c", ans[i][j]);
printf("\n");
}
printf("\n");
scanf("%d%d", &m, &n);
getchar();
}
return 0;
}