解题思路:
说是黄金矿工,其实是扫雷的逻辑。
没有什么算法上的难点,花时间的地方在于输出的数组里既有'*'又有数字,而我定义的数组是int型,所以一开始的想法是用static_cast把有矿的格子转成char型,可那样输出的是42而不是'*',自动转成ASCii码了;然后把数组定义成char型,然后用static_cast把没矿的格子转成int型,可那样输出的是乱码。
最后就摆烂了,直接把有矿的格子标记成9,和其他格子一样该加就加,因为最大只有可能是8(周围一圈全是矿),最后输出时做一下判断,如果大于8了就说明是矿,单独输出'*'。
此题的输出格式要求比较多,一定要注意。
注意事项:
可以优化的地方:
(1)输出结果数组用的是for循环嵌套,甚至还要判断边界输出换行,感觉有更简单的方法。
(2)初始化地图数组和初始化标记数组这两条语句,是否写在一起更方便理解、或者方便阅读,我还没想好。
参考代码:
#include <iostream> #include <cstring> #define MAX 100 // 地图最大尺寸 using namespace std; char position[MAX][MAX]; // 地图 int mark[MAX][MAX]; // 金矿标记 int num = 0; // 地图数 // 8个方向 int directionX[] = { 1,1,1,0,0,-1,-1,-1 }; int directionY[] = { 1,0,-1,1,-1,1,0,-1 }; // 读输入 int n = 0; int m = 0; void mineSweep(); // 挖(sao)矿(lei) int main() { // n+m=0 即n, m都为0时结束 while (cin >> n >> m && (n + m)) { memset(position, 0, sizeof(position)); // 初始化地图 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> position[i][j]; if (position[i][j] != '.' && position[i][j] != '*') { cerr << "DATA ERROR" << endl; // 异常处理 return -1; } } } mineSweep(); cout << endl; } return 0; } void mineSweep() { cout << "Field #" << ++num << ':' << endl; memset(mark, 0, sizeof(mark)); // 标记初始化 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (position[i][j] == '*') { mark[i][j] = 9; // 用于解决char和int一起输出会乱码的问题,mark理论最大值为8,如果超过这个值就说明是'*' for (int k = 0; k < 8; k++) { // 先判断未出界,再更新mark值 if (i + directionX[k] > -1 && i + directionX[k]<n && j + directionY[k]>-1 && j + directionY[k] < m) { mark[i + directionX[k]][j + directionY[k]] += 1; } } } } } // 输出mark for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (mark[i][j] > 8) { cout << '*'; // 判断为'*',单独输出 } else { cout << mark[i][j]; } if (j == m - 1) { cout << endl; // 边界换行 } } } }
0.0分
3 人评分
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:2498 |
汽水瓶 (C语言代码)浏览:764 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题10.1 (Java代码)浏览:1493 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:563 |
C语言考试练习题_保留字母 (C语言代码)浏览:743 |
文科生的悲哀 (C语言代码)浏览:1538 |
1054题解浏览:516 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:497 |
盐水的故事 (C语言代码)浏览:1604 |