这不是标题党,经历了一晚上一早上的调试,我深刻地感觉到物理学不存在了!
这是昨天晚上ABC的第二题 Find snuke(链接),本蒟蒻采用了半枚举式的解题方法,也就是对于每个字母s遍历它的8个方向,如果有字母 n 的话就沿着那个方向继续走,直到走完就输出。然后本蒟蒻开了5个数组存答案,结果恐怖的事情发生了
#include <iostream>
#include <cstdio>
#define MAXN 105
using namespace std;
int mo[10][4];
int H, W;
char S[MAXN][MAXN];
int main () {
cin >> H >> W;
for (int i = 1; i <= H; ++i)
for (int j = 1; j <= W; ++j)
cin >> S[i][j];
mo[1][1] = 0; mo[1][2] = -1; //上
mo[2][1] = 0; mo[2][2] = 1; //下
mo[3][1] = -1; mo[3][2] = 0; //左
mo[4][1] = 1; mo[4][2] = 0; //右
mo[5][1] = -1; mo[5][2] = -1; //左上
mo[6][1] = 1; mo[6][2] = -1; //右上
mo[7][1] = -1; mo[7][2] = 1; //左下
mo[8][1] = 1; mo[8][2] = 1; //右下
for (int i = 1; i <= H; ++i) {
for (int j = 1; j <= W; ++j) {
int ans1[2]; int ans2[2]; int ans3[2];
int ans4[2]; int ans5[2];
if (S[i][j] == 's') {
ans1[1] = i; ans1[2] = j;
bool f = 0;
for (int a = 1; a <= 8; ++a) {
if (S[ i + mo[a][1] ][ j + mo[a][2] ] == 'n') {
ans2[1] = i + mo[a][1];
ans2[2] = j + mo[a][2];
int g31 = i + mo[a][1];
int g32 = j + mo[a][2];
if (S[ g31 + mo[a][1] ][ g32 + mo[a][2] ] == 'u') {
ans3[1] = g31 + mo[a][1];
ans3[2] = g32 + mo[a][2];
}
int g41 = g31 + mo[a][1];
int g42 = g32 + mo[a][2];
if (S[ g41 + mo[a][1] ][ g42 + mo[a][2] ] == 'k') {
ans4[1] = g41 + mo[a][1];
ans4[2] = g42 + mo[a][2];
}
int g51 = g41 + mo[a][1];
int g52 = g42 + mo[a][2];
if (S[ g51 + mo[a][1] ][ g52 + mo[a][2] ] == 'e') {
ans5[1] = g51 + mo[a][1];
ans5[2] = g52 + mo[a][2];
f = 1;
}
}
}
if (f == 1) {
cout << ans1[1] << " " << ans1[2] << endl;
cout << ans2[1] << " " << ans2[2] << endl;
cout << ans3[1] << " " << ans3[2] << endl;
cout << ans4[1] << " " << ans4[2] << endl;
cout << ans5[1] << " " << ans5[2] << endl;
return 0;
}
}
}
}
return 0;
}
大家会发现本蒟蒻的代码应该挺好懂
请注意看这一段 31行
if (S[i][j] == 's') {
ans1[1] = i; ans1[2] = j;
我的代码中只有这个地方出现了ans1的赋值语句,其他地方都没有任何有关ans1的语句。
我运行了一下第一个样例,艹,ans1竟然输出了 5 5,然后我把代码加上了debug,发现ans1的答案本来是对的 5 2,但是在53行后面就离谱地变成了5 5 ???
int g51 = g41 + mo[a][1];
int g52 = g42 + mo[a][2];
大家可以把我的代码粘到编辑器里,会发现一旦把g51后面的的赋值语句删掉之后,ans1就又变对了。
我在想,因为程序是顺序执行的,那么这行人畜无害的赋值语句是怎么改变了当时的赋值?
求大佬们解答,悬赏2个关注,帮我改出来您就是我的神,我会一直在线虚心接受批评。
如果您发现我的代码实际上是因为一个沙雕bug出问题的,恳请稍微轻喷啊~
最后,附上文中提到的hack数据:
in:
6 6
vgxgpu
amkxks
zhkbpp
hykink
esnuke
zplvfj
out:
5 2
5 3
5 4
5 5
5 6
我的输出:
5 5
5 3
5 4
5 5
5 6