林惜城


私信TA

用户名:reminder

访问量:31321

签 名:

等  级
排  名 91
经  验 9074
参赛次数 0
文章发表 95
年  龄 0
在职情况 学生
学  校 西安电子科技大学
专  业

  自我简介:

哈姆


解题思路:

说是黄金矿工,其实是扫雷的逻辑。

没有什么算法上的难点,花时间的地方在于输出的数组里既有'*'又有数字,而我定义的数组是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 人评分

  评论区

膜拜
2022-05-12 12:57:09
  • «
  • 1
  • »