Description
扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相邻的单元格。 0<n,m<=100
Input
输入包含若干个矩阵,对于每个矩阵,第一行包含两个整数n和m,分别表示这个矩阵的行数和列数。接下来n行每行包含m个字符。安全区域用‘.’表示,有地雷区域用'*'表示。当n=m=0时输入结束。
Output
对于第i个矩阵,首先在单独的一行里打印序号:“Field #i:”,接下来的n行中,读入的'.'应被该位置周围的地雷数所代替。输出的每两个矩阵必须用一个空行隔开。
(注意两个矩阵之间应该有一个空行,由于oj的格式化这里不能显示出来)
Sample Input 1
4 4 *... .... .*.. .... 3 5 **... ..... .*... 0 0
Sample Output 1
Field #1: *100 2210 1*10 1110 Field #2: **100 33200 1*100
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
0<n,m<=100
#include<stdio.h>
#define MAX 100
int fun(char M[MAX][MAX],int n, int m, int i, int j) { //当前点不是雷时,判断当前点周围雷的个数
int num=0;
//当前点周围即 i-1 ~ i+1,j-1 ~ j+1 ,(这里遍历了当前区域的9个点,包含当前点(肯定不是雷))
for(int a=i-1;a<=i+1;a++) {
for(int b=j-1;b<=j+1;b++) {
if(a>=0 && b>=0 && a<n && b<m && M[a][b]=='*') { //注意做边界判断
num++;
}
}
}
return num;
}
int main()
{
int n,m,count=1;
while(scanf("%d %d",&n,&m)==2 && n && m ) {
char Mines[MAX][MAX];
int i,j;
for(i=0;i<n;i++) { //注意一下二维字符数组的输入方式
scanf("%s",Mines[i]);
}
if(count>1) printf("\n"); //添加这一行代码测试才会AC,不加这一行状态会为Presentation erro,不太理解。。。
printf("Field #%d:\n",count);
//遍历二维数组
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
if(Mines[i][j]=='.') { //如果不是雷,执行fun函数返回当前点周围的雷的个数
printf("%d",fun(Mines,n,m,i,j));
}
if(Mines[i][j]=='*'){ //如果是雷,直接输出*
printf("*");
}
}
printf("\n");
}
count++;
}
return 0;
}