问题描述
扫雷游戏你一定玩过吧!现在给你若干个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]); } } } }