因为这道题的驷马输入——
题目中描述道,这个矩阵的高度为 Y,宽度为 X,然而输入的时候先给的是 X,后给的是 Y,所以我们循环的时候应该把 Y 放在外层。
不仅如此,由于这个矩阵“跟一般的坐标系相同,(1,1) 代表图的左下角。”我们需要把第一重循环反着跑。
像这样:
int main() {
scanf("%d%d%d%d", &m, &n, &mx, &my);
for(int i = n; i >= 1; i --)
for (int j = 1; j <= m; j ++) {
char c;
scanf(" %c", &c);
tsp[i][j] = (c == '*');
}
}
当然,如果你用了别的操作来转化这个坐标系的问题,当我什么都没说。
只要我们反着输入,就可以把这张图在纵轴上翻转 180°(你可以看做是做了一个镜像的操作,将这个矩阵上下翻转了),也就变成了题目中所描述的坐标系样式。于是我们的 mx 和 my 就可以正常使用。
……吗?
no no no no,这道题输入的逆天之处还没有完全体现出来
当我改成了以上这种输入方式后,我发现我仍然会寄在原来的地方。于是我找来了旁边的队友帮忙。
令人震惊的是,输入的时候,我们需要把 i 和 j 反过来。这个问题是伟大的队友帮我调题的时候告诉我的。
当然,在听到这个消息后,我百思不得其解。然后我把这个数组输出了。于是,我惊奇地发现,这样输入竟然跟正常输入不一样。
但是,这样输入的确是能 AC 的,所以它就是正确的。
下面贴上我的输入。
int main() {
scanf("%d%d%d%d", &m, &n, &mx, &my);
for(int i = n; i >= 1; i --)
for (int j = 1; j <= m; j ++) {
char c;
scanf(" %c", &c);
tsp[j][i] = (c == '*');
}
q.push(make_pair(mx, my));
bfs();
printf("%d", ans);
}
但是,既然这样输入可以 AC,那么一定有它的道理。但是我无法理解这样输入的正确性。
当然,如果有 dalao 知道这是怎么回事,请您在本帖下回复我,也让此后写这道题的 OIER 们少走一些弯路 QAQ。