UVA 10189 -Minesweeper

来源:互联网 发布:python ftplib 编辑:程序博客网 时间:2024/04/24 18:04

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 directionconst 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 fieldbool 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;}
原创粉丝点击