问题描述
扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相邻的单元格。 0< n,m< =100
输入格式
输入包含若干个矩阵,对于每个矩阵,第一行包含两个整数n和m,分别表示这个矩阵的行数和列数。接下来n行每行包含m个字符。安全区域用‘.’表示,有地雷区域用’*‘表示。当n=m=0时输入结束。
输出格式
对于第i个矩阵,首先在单独的一行里打印序号:“Field #i:”,接下来的n行中,读入的’.'应被该位置周围的地雷数所代替。输出的每两个矩阵必须用一个空行隔开。
思路:遍历每个点,如果本身是地雷直接输出,否则统计周围的地地雷并输出~
#include <stdio.h>
#include <string.h>
int main()
{
int n, m, i, j, d = 1;
char lei[1000][1000];
while (scanf ("%d %d", &n, &m))
{
if ( n == 0 && m == 0)
break;
else
{
memset(lei, 0, sizeof(lei));
for (j = 0; j < n; j++)
{
char temp = getchar();
for (i = 0; i < m; i++)
scanf ("%c", &lei[j][i]);
}
if (d != 1) printf ("\nField #%d:\n", d++);
else printf ("Field #%d:\n", d++);
for (j = 0; j < n; j++)
{
for (i = 0; i < m; i++)
{
int tot = 0;
if (lei[j][i] == '*')
printf ("*");
else
{
if (j-1 >= 0 && i-1 >= 0 && lei[j-1][i-1] == '*') tot++;
if (j-1 >= 0 && i >= 0 && lei[j-1][i] == '*') tot++;
if (j-1 >= 0 && i+1 < m && lei[j-1][i+1] == '*') tot++;
if ( i-1 >= 0 && lei[j][i-1] == '*') tot++;
if ( i+1 < m && lei[j][i+1] == '*') tot++;
if (j+1 < n && i-1 >= 0 && lei[j+1][i-1] == '*') tot++;
if (j+1 < n && lei[j+1][i] == '*') tot++;
if (j+1 < n && i+1 < m && lei[j+1][i+1] == '*') tot++;
printf ("%d", tot);
}
}
printf ("\n");
}
}
}
}
#include<stdio.h>
#define N 110
int main()
{
char a[N][N];
int n,m,t,i,j,k=1;
static int b[N][N];
for(n=m=1; n!=0 && m!=0; )
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
b[i][j]=0;
}
scanf("%d %d",&n,&m);
for(t=n;t>0;t--)
scanf("%s",a[n-t]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]=='*')
{
b[i][j]++;b[i+1][j]++;b[i+2][j]++;b[i][j+1]++;b[i+2][j+1]++;b[i][j+2]++;b[i+1][j+2]++;b[i+2][j+2]++;
}
}
}
if(n!=0&&k>1) {printf("\nField #%d:\n",k); k++;}
else if(n!=0) {printf("Field #%d:\n",k); k++;}
for(i=0;i<n;i++,printf("\n"))
{
for(j=0;j<m;j++)
{
if(a[i][j]=='*') printf("*");
else printf("%d",b[i+1][j+1]);
}
}
}
}