1176: 扫雷
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 342 Solved: 144
[Submit][Status][Web Board]
Description
大家都应该玩过扫雷这个游戏吧.就是在一个nm的矩阵中有若干个雷,你需要将他们全部找出来才能获得胜利.其他格子用数字表示代表这个格子周围有几个雷.如果在一个nm的矩阵中我已经告诉你所有雷的位置,你能将这个矩阵补全嘛?
Input
多组测试数据.每组数据的第一行包含两个正整数n,m(1<=n,m<=100).接下来n行每行有m个不是9就是-1的整数.9代表这个位置有雷,-1代表这个位置是数字.
Output
对于每组测试数据输出一个n*m的补全后的矩阵.用一个空行分隔两个矩阵.注意最后一个矩阵后面没有空行.
Sample Input
2 3
9 -1 9
-1 -1 9
2 4
9 -1 -1 -1
9 9 9 9
Sample Output
939
139
9432
9999
HINT
Source
/*
思路:明确 周围 的范围
我不玩扫雷,所以根据生活经验我无法确定范围,所以只能根据样例来推断这个范围
由样例可以发现一个数字周围的范围是以它为中心构成的3x3的正方形:
f f f
f num f
f f f
明确这点就好做了。。
一个数字周围最多8个雷,每输入一个数字9就可以确定它周围非雷数字的值应该+1
*/
AC_code:
#include <stdio.h>
int n,m;
int a[105][105];
int step_x[]={1,-1,1,1,0,0,-1,-1},step_y[]={0,0,1,-1,1,-1,1,-1};
void update(int x,int y)
{
a[x][y] = 9;
for(int i = 0; i < 8; i++)
{
int xx = x + step_x[i];
int yy = y + step_y[i];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]!=9)
{
a[xx][yy]++;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
a[i][j] = 0;
}
}
int num;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d",&num);
if(num == 9)
update(i,j);
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%d",a[i][j]);
}
puts("");
}
puts("");
}
return 0;
}