解题思路:题目其实不难,但是处理的时候技巧性很强,在输入过程中利用标志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;
}
}