问题描述
背景
你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?;-)在游戏中要想过关,就必须要在一个 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秒 | 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>