解题思路:
注意事项:
参考代码:
#include<bits/stdc++.h>
#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分
0 人评分
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:440 |
点我有惊喜!你懂得!浏览:1166 |
C语言程序设计教程(第三版)课后习题7.2 (Java代码)浏览:694 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:549 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:597 |
大神老白 (C语言代码)浏览:694 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:566 |
计算质因子 (C++代码)浏览:1825 |
C语言程序设计教程(第三版)课后习题8.2 (C语言代码)浏览:5275 |
本人酷爱递归实现很多问题,这里也是浏览:632 |