解题思路:本质上其实就是扫雷游戏,摒弃原有多层判断(四角、边缘、内部)。

              换一种思路:既然是计算周围九宫格的雷数,就应该想到只要遍历对应元素周围(行差<=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';
}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论