泽雍代码找虫
2026-08-26 11:22:07
发布于:广东
你输出“一串乱码”的直接原因就在这里:
a[i][j] = cnt;
因为 a 是 char 数组。比如 cnt = 3,你存进去的是 ASCII 编码为 3 的控制字符,而不是字符 '3'。
应该改成:
a[i][j] = cnt + '0';
但是你的代码还有两个问题,即使把乱码修掉,答案也会错。
你的代码需要改 3 处
① 数字要转成字符
原来:
a[i][j] = cnt;
改成:
a[i][j] = cnt + '0';
② a 没初始化,而且你还没把所有雷放进去,就开始检查周围
你现在是一边遍历:
if(...) {
a[i][j] = '*';
}
else {
if(a[i + 1][j] == '*') ...
}
比如现在处理 (1,1),此时 (2,1) 还没处理,a[2][1] 里面是垃圾值。
所以必须先:
先把所有雷标成 '*'
再:
遍历整个地图统计答案
③ 你判断雷的位置写错了
你写:
if(i == b[i * 2 - 1] && j == b[2 * i])
这里的 i 是地图行号,不是第几个雷。
比如有雷:
(1,1)
(1,3)
你的写法只可能找到 (1,1),无法正确找到 (1,3)。
按照你原来的代码,尽量不重构,可以这样改:
#include<bits/stdc++.h>
using namespace std;
int main(){
int x, y, z;
cin >> x >> y >> z;
char a[x + 5][y + 5];
int b[z * 2 + 5];
// 先初始化,防止垃圾值
memset(a, 0, sizeof(a));
for(int i = 1; i <= z * 2; i++){
cin >> b[i];
}
// ① 先把所有雷标出来
for(int i = 1; i <= z; i++){
a[b[i * 2 - 1]][b[i * 2]] = '*';
}
// ② 再统计每个非雷区周围的雷
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
if(a[i][j] == '*') continue;
int cnt = 0;
if(a[i + 1][j] == '*') cnt++;
if(a[i - 1][j] == '*') cnt++;
if(a[i][j + 1] == '*') cnt++;
if(a[i][j - 1] == '*') cnt++;
if(a[i + 1][j + 1] == '*') cnt++;
if(a[i + 1][j - 1] == '*') cnt++;
if(a[i - 1][j + 1] == '*') cnt++;
if(a[i - 1][j - 1] == '*') cnt++;
// ③ cnt 是数字,要转成字符
a[i][j] = cnt + '0';
}
}
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
你现在最需要理解的一点就是:
char c = 3; // 乱码/控制字符
char c = '3'; // 字符 3
char c = 3 + '0'; // 字符 3
所以你原程序出现乱码,最直接就是 a[i][j] = cnt; 这一行导致的。
这里空空如也


















有帮助,赞一个