未来改变了过去???
  • 板块学术版
  • 楼主Ruan_ji
  • 当前回复13
  • 已保存回复13
  • 发布时间2023/5/21 09:16
  • 上次更新2023/10/23 15:10:30
查看原帖
未来改变了过去???
405146
Ruan_ji楼主2023/5/21 09:16

引出问题

这不是标题党,经历了一晚上一早上的调试,我深刻地感觉到物理学不存在了!

这是昨天晚上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
2023/5/21 09:16
加载中...