poj-2612

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值