[问题描述]
Have you ever played Minesweeper? It’s a cute little game which comes within a certain Operating
System which name we can’t really remember. Well, the goal of the game is to find where are all the mines within a M × N field. To help you, the game shows a number in a square which tells you how many mines there are adjacent to that square. For instance, supose the following 4 × 4 field with 2 mines (which are represented by an ‘*’ character):
*...
....
.*..
....
If we would represent the same field placing the hint numbers described above, we would end up
with:
*100
2210
1*10
1110
As you may have already noticed, each square may have at most 8 adjacent squares.
[输入]
The input will consist of an arbitrary number of fields. The first line of each field contains two integers
n and m (0 < n, m ≤ 100) which stands for the number of lines and columns of the field respectively.
The next n lines contains exactly m characters and represent the field.
Each safe square is represented by an ‘.’ character (without the quotes) and each mine square
is represented by an ‘*’ character (also without the quotes). The first field line where n = m = 0
represents the end of input and should not be processed.
[输出]
对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。这三个整数应该用单个空格隔开,且在同一行输出。对于读入的每一组数据,在输出中应位于单独的一行。
[样例输入]
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
[样例输出]
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
*/
题意:有地雷的输出*,没地雷的输出这个格子周围地雷的数量,格子周围包括上下左右八个方向。
没看懂题意所以看题解了,我,在这里发誓,下个题不准看题解,全靠自己想!!!
思路:很简单,当遇见地雷的时候遍历他前后左右上下八个位置,标记+1。
输出的时候是地雷直接输出*,否则输出标记的数组。
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define maxn 1005
char map[maxn][maxn];
int f[maxn][maxn];
int main()
{
int n,m;
int kase = 1;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
cin>>map[i][j];
if(map[i][j]=='*')
{
for(int p = -1; p < 2; p ++)
for(int q = -1; q < 2; q ++)
f[i+p][j+q]++;
}
}
printf("Field #%d:\n",++kase);
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
if(map[i][j]=='*')
printf("*");
else
printf("%d",f[i][j]);
}
printf("\n");
}
}
}