Minesweeper UVA - 10189 (枚举+模拟)

Minesweeper UVA - 10189

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.

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, 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.

Output

For each field, you must print the following message in a line alone:
Field #x:
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 adjacent mines to that square. There must be
an empty line between field outputs.

Examples

Sample Input
4 4


.


3 5
**…

.
0 0
Sample Output
Field #1:
100
2210
1
10
1110
Field #2:
**100
33200
1
100

Hint




题意:

模拟扫雷的游戏, 给出地雷的位置, 输出类似游戏中的数字地图(相邻8个单元格)

题解:

枚举+模拟即可

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const int inf = 1<<30;
const LL maxn = 110;

bool src[maxn][maxn];
int tar[maxn][maxn], N, M, inde = 1;
int act[8][2] = {{1,0},{1,1},{1,-1},{-1,0},{-1,1},{-1,-1},{0,1},{0,-1}};
void solve(){
    int cx, cy;
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M; j++)
            if(src[i][j]){
                tar[i][j] = -1;
                for(int k = 0; k < 8; k++){
                    cx = i+act[k][0], cy = j+act[k][1];
                    if(cx>0&&cx<=N&&cy>0&&cy<=M && tar[cx][cy]!=-1)
                        tar[cx][cy]++;  //四周数量++
                }
            }
}
int main()
{
    char input;
    while(~scanf("%d%d",&N,&M)&& M!=0&&N!=0){
        ms(src, 0); ms(tar, 0);
        for(int i = 1; i <= N; i++)
            for(int j = 1; j <= M; j++){
                scanf(" %c",&input);
                if(input=='*') src[i][j] = true;
            }
        solve();
        if(inde>1) printf("\n");
        printf("Field #%d:\n", inde++);
        for(int i = 1; i <= N; i++){
            for(int j = 1; j <= M; j++){
                if(tar[i][j]==-1) printf("*");
                else printf("%d",tar[i][j]);
            }
            printf("\n");
        }
    }
	return 0;//
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值