解析: 简单的一题。思路很明显:遍历所有的字符,若果是‘*’,就对他的四周的字符通通加1;
但是有两点需要注意:1.要考虑边界问题
2.加1时要避开地雷
但是可以用一种特殊的技巧避开以上的问题。
1.数组从第二位开始
2.让地雷的字符远小于数字字符,这样最后只要它小于数字字符,就输出‘*’
1 #include <stdio.h> 2 int main() 3 { 4 char ch[105][105]; 5 int n, m, i, j, kase = 0; 6 while(scanf("%d %d", &n, &m) == 2 && n && m){ 7 /*数组从第二位开始写入,防止出界*/ 8 for(i = 1; i <= n; i++){ 9 scanf("%s", ch[i]+1); 10 for(j = 1; j <= m; j++) 11 if(ch[i][j] == '.') 12 ch[i][j] = '0'; 13 else 14 ch[i][j] = 10; /*不错的技巧*/ 15 } 16 for(i = 1; i <= n; i++) 17 for(j = 1; j <= m; j++) 18 if(ch[i][j] < '0'){ 19 ch[i-1][j-1]++; 20 ch[i-1][j]++; 21 ch[i-1][j+1]++; 22 ch[i][j-1]++; 23 ch[i][j+1]++; 24 ch[i+1][j-1]++; 25 ch[i+1][j]++; 26 ch[i+1][j+1]++; 27 } 28 if(kase != 0) 29 printf("\n"); 30 /*输出的最后一行和输出的第一行都没有空行*/ 31 printf("Field #%d:\n", ++kase); 32 for(i = 1; i <= n; i++){ 33 for(j = 1; j <= m; j++) 34 if(ch[i][j] < '0') 35 printf("*"); 36 else 37 printf("%c", ch[i][j]); 38 printf("\n"); 39 } 40 } 41 return 0; 42 }