我也不知道为什么我的vs打不开这个头文件
官方解法:它是按照从a[1][1]开始输入字符,并且划分到110,所以当i-1和j-1的时候是有开创了空间的数组了的,由于判断语句是*,所以原本的0是不相匹配的。
我的解法:我本来也是想穷举那八个,而且还是把数组外围变成两行两列加四个角,相当于8个情况加中间的一起穷举,可是写着写着感觉太麻烦了,然后发现可以for循环那8个位置呀,当不满足的时候就跳过继续嘛,这不就是continue语句吗!然后就利用这样列出来了
#include<iostream>
using namespace std;
#define N 100
#define M 100
//输入地雷分布
void f(int n,int m,char a[N][M]) {
for(int i=0;i<n;i++)
for (int j = 0; j < m; j++) {
char x;
cin >> x;
a[i][j] = x;
}
}
//寻找非地雷区周围的地雷数量
int s(int n, int m, int i,int j,char a[N][M]) {
int k = 0;
for (int x = i - 1; x <= i + 1; x++) {
if (x == -1 || x == n)continue;
for (int y = j - 1; y <= j + 1; y++) {
if (y == -1 || y ==m)continue;
if (a[x][y] == '*')k++;
}
}
return k;
}
int main() {
int n, m;
cin >> n >> m;
char a[N][M] = {};
f(n, m, a);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == '?')cout << s(n, m, i, j, a);
else cout << '*';
}
cout << "\n";
}
return 0;
}
这是本来的穷举情况,并没有列举完
//两行两列四个角
if (i == 0 && j != 0 && j != m - 1) {
if (a[i][j-1] == '*')k++;
if (a[i][j+1] == '*')k++;
if (a[i+1][j-1] == '*')k++;
if (a[i+1][j] == '*')k++;
if (a[i+1][j+1] == '*')k++;
}
if (i == n-1 && j != 0 && j != m - 1) {
if (a[i][j - 1] == '*')k++;
if (a[i][j + 1] == '*')k++;
if (a[i - 1][j - 1] == '*')k++;
if (a[i - 1][j] == '*')k++;
if (a[i - 1][j + 1] == '*')k++;
}
if (j == 0 && i != 0 && i != n - 1) {
if (a[i-1][j] == '*')k++;
if (a[i+1][j] == '*')k++;
if (a[i - 1][j + 1] == '*')k++;
if (a[i][j+1] == '*')k++;
if (a[i + 1][j + 1] == '*')k++;
}
if (j == m-1 && i != 0 && i != n - 1) {
if (a[i - 1][j] == '*')k++;
if (a[i + 1][j] == '*')k++;
if (a[i - 1][j - 1] == '*')k++;
if (a[i][j - 1] == '*')k++;
if (a[i + 1][j - 1] == '*')k++;
}
if (i == 0 && j == 0) {
if (a[i][j + 1] == '*')k++;
if (a[i+1][j] == '*')k++;
if (a[i+1][j + 1] == '*')k++;
}
if (i == 0 && j == m-1) {
if (a[i][j + 1] == '*')k++;
if (a[i + 1][j] == '*')k++;
if (a[i + 1][j + 1] == '*')k++;
}