Minesweeper 蓝桥杯 扫雷游戏(化繁为简)(摒弃多层循环)
题目描述
Minesweeper 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
输入
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$ \le$100) 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.
输出
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.
样例输入
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
样例输出
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
解题思路:本质上其实就是扫雷游戏,摒弃原有多层判断(四角、边缘、内部)。
换一种思路:既然是计算周围九宫格的雷数,就应该想到只要遍历对应元素周围(行差<=1 && 列差<=1)同时字符=='*'即可
参考代码:
#include<iostream>
#include<cmath>
#define maxn 105
using namespace std;
void printScreen(char (*result)[maxn], int m, int n, int num);
int main()
{
int a,b;
int num=0;
char mineWeeper[maxn][maxn];
char mineResult[maxn][maxn]; //存储结果
while(cin>>a>>b && a!=0 && b!=0){
num++;
for(int i=0; i<a; i++){
for(int j=0; j<b; j++){
cin >> mineWeeper[i][j];
}
}
int y=0,x=0;
while(y<a && x<b){
int cnt=0; //雷数
if(mineWeeper[y][x] == '*') mineResult[y][x] = '*';
else{
for(int i=0; i<a; i++){
for(int j=0; j<b; j++){
if(abs(i-y)<=1 && abs(j-x)<=1 && mineWeeper[i][j]=='*') cnt++;
}
}
mineResult[y][x] = cnt+'0';
}
if(x+1>=b){
y++;
x = 0;
}else x++;
}
printScreen(mineResult, a, b, num);
}
return 0;
}
void printScreen(char (*result)[maxn], int m, int n, int num){
cout << "Field #" << num << ":" <<endl;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cout << result[i][j];
if(j == n-1) cout<<'\n';
}
}
cout<<'\n';
}

浙公网安备 33010602011771号