原题链接:Minesweeper
解题思路:1.如果是*直接输出,else就考虑相邻元素,这里的相邻元素是核心,可以先考虑同一行和同一列的相邻元素(曼哈顿距离)
abs(i - x) + abs(j - y) < 2 // 上下左右的相邻元素
然后再考虑四角的位置元素。
if (i != x && j != y && abs(i - x) + abs(j - y) == 2)
注意事项:结束的条件,
while(cin >> n >> m, n, m) //当n, m都不为零时,一直循环。
参考代码:
```
#include <iostream> //#include <utility> using namespace std; const int N = 110; const int M = 110; char q[M][N]; int m, n; int getSolve (int x, int y){ int ant = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) //曼哈顿距离,可以知道同一行、同一列的相邻元素是否为* if (abs(i - x) + abs(j - y) < 2) { if (q[i][j] == '*') ant++; } //处理四角位置的元素是否为* else if (abs(i - x) + abs(j - y) == 2) if (i != x && j != y && q[i][j] == '*') ant++; } return ant; } int main(){ int d = 1; // 如果m,n都不为0,一直循环下去 while (cin >> m >> n, m, n) { cout << "Field #" << d << ":" << endl; //初始化数组 char ch; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> ch; q[i][j] = ch; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if(q[i][j] == '*') cout << '*'; else cout << getSolve (i, j); } cout << endl; // 每一行回车 } cout << endl; // 每一段的空行 d ++; } return 0; }
```
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复