原题链接:Minesweeper
解题思路:
在你输入的网格周围,在填充一圈格子,并且这一圈格子都是没有雷的。
遍历你输入的网格:
如果这个格子上是雷的话,遍历下一个格子。
如果这个格子不是雷的话,将每个小格子与它周边的八个格子看作一个单元结构,遍历这个九宫格,计算雷的数量。
注意事项:
填充完一圈格子之后,原本m*n的网格变成了(m+2)*(n+2)的网格
注意输出格式,笔者因为输出格式的问题,被恶心了好多次呢:>
参考代码:
#include<iostream> using namespace std; int main() { char a[52][52] = { 0 }; int m, n, w = 1;//m n分别是输入网格的纵长和横长,w用作计数器,记录file数量 cin >> m >> n; while (m != 0 && n != 0) { //给周边一圈赋值'.' for (int i = 0; i < n + 2; i++) a[0][i] = '.';//第0行 for (int i = 1; i < m+1; i++) { a[i][0] = '.';//给每一行的第一个格子赋值'.' for (int x = 1; x <= n; x++) cin >> a[i][x]; a[i][n + 1] = '.';//给每一行的最后一个格子赋值'.' } for (int i = 0; i < n + 2; i++) a[m + 1][i] = '.';//最后一行 cout << "Field #" << w << ':' << endl;//题目要求 //遍历网格中你要输出的格子 for (int i = 1; i <= m; i++)//注意:从第一行开始,不是第0行 { for (int j = 1; j <= n; j++)//同上 { int p = 0;//初始化雷的数量为0 if (a[i][j] == '*') { cout << '*'; continue;//如果该格中有雷,则不用计算它周边雷数,直接进入下一次循环 } else//如果该格中没有雷,遍历以它为中心的九宫格 { for (int x = i - 1; x < i + 2; x++)//自行画图理解 for (int y = j - 1; y < j + 2; y++) if (a[x][y] == '*')p++;//有雷则p+1 } cout << p;//输出每个格子周围的雷数 } cout << endl; } cout << endl; w++;//输出完一组后w+1 cin >> m >> n;//输入下一组数据 } return 0; }
第一次写题解,请多包涵
笔者才大一,写的不好别骂,标题装杯用的,所以在最后装死了
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复