/*
Have you ever played Minesweeper? This cute little game comes with
a certain operating system whose name we can't remember. The goal
of the game is to find where all the mines are located within
a M x N field.
The game shows a number in a square which tells you how many mines
there are adjacent to that square. Each square has at most eight
adjacent squares. The 4 x 4 field on the left contains two mines,
each represented by a ``*'' character. If we represent the same
field by the hint numbers described above, we end up with the field
on the right:
*...
....
.*..
....
*100
2210
1*10
1110
Input
The input will consist of an arbitrary number of fields. The first
line of each field contains two integers n and m ( 0 < n, m100) which
stand for the number of lines and columns of the field, respectively.
Each of the next n lines contains exactly m characters, representing
the field.
Safe squares are denoted by ``.'' and mine squares by ``*,'' both
without the quotes. The first field line where n = m = 0 represents
the end of input and should not be processed.
Output
For each field, print the message Field #x: on a line alone, where
x stands for the number of the field starting from 1. The next n
lines should contain the field with the ``.'' characters replaced
by the number of mines adjacent to that square. There must be an
empty line between field outputs.
Sample Input
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
Sample Output
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
*/
#include <iostream>
#include <string>
#include <string.h>
#include <map>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <set>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max_N 108
#define Max_M 108
using namespace std;
int N , M ;
int num;
int Field[Max_N][Max_M];
int dir[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
bool IsLegal(int x,int y) //判断有没有出界
{
return 1 <= x <= N&& 1 <= y <= M;
}
void judge(char ch , int p, int q) //如果ch为*,将八邻域加1
{
if(ch == '*')
{
Field[p][q] = -1;
for(int i = 0;i < 8;i++)
{
int x = p + dir[i][0];
int y = q + dir[i][1];
if(IsLegal(x , y)&&Field[x][y] != -1) //如果八邻域中某个也为*,则此处不处理
{
Field[x][y]++;
}
}
}
}
void solve()
{
//边读入边判断
for(int i = 1;i <= N;i++)
{
string s;
cin>>s;
for(int j = 1;j <= M;j++)
{
judge(s[j-1],i,j);
}
}
//输出
printf("Field #%d:\n",num);
for(int i = 1;i <= N;i++)
{
for(int j = 1;j <= M;j++)
{
Field[i][j] == -1?printf("%c",'*'):printf("%d",Field[i][j]);
}
printf("\n");
}
}
int main()
{
freopen("A.txt","r",stdin);
num = 0;
while(scanf("%d%d",&N,&M)&&N != 0&&M != 0)
{
num++;
if(num > 1) printf("\n"); //Field之间要空一行,但最后一个Field结束后不需要空行。此处导致很多次PE。。
memset(Field, 0 , sizeof(Field));
solve();
}
return 0;
}
UVa 10189 Problem: Minesweeper (PC 110102)
最新推荐文章于 2018-02-01 09:15:55 发布