扫雷

问题描述

背景

你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?;-)在游戏中要想过关,就必须要在一个 NxM 的区域上找出所有的地雷。游戏过程中,计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。例如,在下面这个有两颗地雷的 4x4 的地图(*表示地雷):

*... .... .*.. .... 

根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:

*100 2210 1*10 1110 

每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。

输入

输入中将包括一系列的地图,每个地图的第一行有两个整数 n 和 m(0 <n,m <= 100),它们表示了地图的行数和列数。下面的 n 行每行都有 m 个字符,其中 "." 表示安全而 "*" 表示地雷。如果地图的 n 和 m 都为 0,则表示输入结束。

输出

针对每一个地图,首先输出一行:

Field #x:

其中 x 是当前地图的编号(从 1 开始)。下面的 n 行则将地图中的 "." 以数字表示,该数字表示该方格周围有多少颗地雷。

来源

http://acm.uva.es/problemset/v101/10189.html


测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 4 4↵
  2. *...↵
  3. ....↵
  4. .*..↵
  5. ....↵
  6. 3 5↵
  7. **...↵
  8. .....↵
  9. .*...↵
  10. 0 0↵
以文本方式显示
  1. Field #1:↵
  2. *100↵
  3. 2210↵
  4. 1*10↵
  5. 1110↵
  6. Field #2:↵
  7. **100↵
  8. 33200↵
  9. 1*100↵
1秒 1024KB 0
题解思路

       维护两个数组,一个是输入数组,一个是转换之后的数组。在输入数组中遇到“*”就在输出数组对应位置的周围一圈八个位置加1。依次遍历完整个输入数组即可。

       注意:

(1)注意输出数组的初始化,用memset()函数进行初始化,使数组元素都为0。

(2)注意数组的边界,越出边界是不能处理的。


实现代码


<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#define N 110
int main()
{
	char a[N][N];
	int hang=1,lie=1,temp,i,j,k=1;
    int b[N][N];
	
	while(scanf("%d %d",&hang,&lie)==2)  //数据输入 
	{
		if(hang==0&&lie==0)
		break;
		for(i=0;i<N;i++)
		{
			for(j=0;j<N;j++)
			b[i][j]=0;
		}
		for(temp=0;temp<hang;temp++)
		{
			scanf("%s",a[temp]);
		}
			
	    for(i=0;i<hang;i++)
		{
			for(j=0;j<lie;j++)
			{
				if(a[i][j]=='*') 
				{
					b[i][j]++;
					b[i][j+1]++;
					b[i][j+2]++;
					b[i+1][j]++;
					b[i+1][j+2]++;
					b[i+2][j]++;
					b[i+2][j+1]++;
					b[i+2][j+2]++;
				}
			}
		}
		
		if(k>1)
		 {
		 printf("\nField #%d:\n",k);
		  k++;
		  }
		else 
		 {
		 printf("Field #%d:\n",k);
		  k++;
		  }
	    for(i=0;i<hang;i++)
		{
			for(j=0;j<lie;j++)
			{
				if(a[i][j]=='*')
				 printf("*");
			    else 
				 printf("%d",b[i+1][j+1]);
			}
			printf("\n");
		}
 	}
 	
 	return 0;
}</span>



你可能感兴趣的:(扫雷)