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



