解题思路:题目其实不难,但是处理的时候技巧性很强,在输入过程中利用标志flag直接判断有无触发地雷,直接省去了两个for循环。多次使用a?b:c的结构,省去了大量不必要的判断语句,其实解题时还要注意的就是,我们应该把所有的点周围的地雷数利用二重循环存储到数组中,而不应该在判断的时候在临时计算。此题给我最大的启发就是,提前将一些要计算的算好存起来,不要一边判断一边计算,效率极低还易出错
#include<stdio.h> //boom[20][20]表示地雷阵 ,try[20][20]表示触发阵 ,count[20][20]表示每个区域的周围8个方向的地雷个数。 char boom[20][20],try[20][20]; int count[20][20]; int d[8][2]={0,1,0,-1,1,-1,1,0,1,1,-1,0,-1,1,-1,-1};//表示8个方向 int w,k; int i,j,flag,n; int judge(int x,int y) { //如果周围的点都没有超过区域的范围并且地雷阵在此处是地雷,那么就返回1 return x>=0&&y>=0&&x<n&&y<n&&boom[x][y]=='*'?1:0; } //计算周围8个方向的地雷个数 int sum(int x,int y) { int count=0; if(boom[x][y]=='*') return -1; else { for(k=0;k<8;k++)//这个for循环可以用注释的语句块实现 { count+=judge(x+d[k][0],y+d[k][1]); } /* for(k=-1;k<=1;k++) for(w=-1;w<=1;w++) count+=judge(x+k,y+w); */ } return count; } int main() { while(scanf("%d",&n)!=EOF) { //输入地雷阵 for(i=0;i<n;i++) scanf("%s",boom[i]); //输入触发阵 for(i=0;i<n;i++) { scanf("%s",&try[i]); for(j=0;j<n;j++) { if(try[i][j]=='x'&&boom[i][j]=='*') //判断是否触发地雷,用一个flag标志来表示 flag=1; } } //计算每个区域周围的地雷数 for(i=0;i<n;i++) for(j=0;j<n;j++) count[i][j]=sum(i,j); if(flag)//触发地雷 { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(boom[i][j]=='*') printf("%c",'*'); else printf("%c",try[i][j]=='x'?count[i][j]+'0':'.'); } printf("\n");//记得换行 } } else { for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%c",try[i][j]=='x'?count[i][j]+'0':'.'); printf("\n");//记得换行 } } return 0; } }