UVA 10189 -Minesweeper

Description:
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.

Sample Input

4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0

Sample Output

Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100

题意:类似于扫雷的游戏,在一个m x n区域里面有一定数量的雷,不是雷的地方用‘.’表示,我们需要把这块区域用星花’**'和数字表示出来,其中雷的位置依然使用‘*’表示,不是雷的位置使用一个数字表示其周围8个位置雷的个数
方法:可以使用二维数组用于记录这块区域,遍历一次二维数组,判断这个位置是否是雷和不是雷时周围8个位置雷的数量,可以使用两个一维数组用来判断周围8个位置是否有雷,即行数和列数的增量。要注意的是题目要求每两组数据之间用一个空行隔开,所以最后一组数据后面不可以有空行。

#include <iostream>

using namespace std;

//the eight direction
const int dirX[] = {0, 0, -1, -1, -1, 1, 1, 1};
const int dirY[] = {1, -1, 0, -1, 1, 0, -1, 1};

char mines[101][101];
int row, col;//the size of field

bool isRight(int m, int n){
    if(m < 0 || n < 0 || m >= row || n >= col)
        return false;
    return true;
}

void printMines(int m, int n){
    if(mines[m][n] == '*')
        cout << '*';
    else{
        int num = 0;
        for(int i = 0; i < 8; i++){
            if(isRight(m + dirX[i], n + dirY[i]) && mines[m + dirX[i]][n + dirY[i]] == '*')
                num++;
        }
        cout << num;
    }
}

int main(){
    int cnt = 1;//count the times
    while(cin >> row >> col && row && col){
        if(cnt != 1)
            cout << endl;
        for(int i = 0; i < row; i++){
            for(int j = 0; j < col; j++){
                cin >> mines[i][j];
            }
        }
        cout << "Field #" << cnt++ << ':' << endl;
        for(int i = 0; i < row; i++){
            for(int j = 0; j < col; j++){
                printMines(i, j);
            }
            cout << endl;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值