警示后人
查看原帖
警示后人
593430
Boluo_chuixue楼主2023/10/29 08:06

如果你像我一样锅在第 1010 个点,那么这里可能是一个比较可能的错误原因:输入。

因为这道题的驷马输入——

题目中描述道,这个矩阵的高度为 YY,宽度为 XX,然而输入的时候先给的是 XX,后给的是 YY,所以我们循环的时候应该把 YY 放在外层。

不仅如此,由于这个矩阵“跟一般的坐标系相同,(1,1)(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°180°(你可以看做是做了一个镜像的操作,将这个矩阵上下翻转了),也就变成了题目中所描述的坐标系样式。于是我们的 mxmx 和 mymy 就可以正常使用。

……吗?

no no no no,这道题输入的逆天之处还没有完全体现出来

当我改成了以上这种输入方式后,我发现我仍然会寄在原来的地方。于是我找来了旁边的队友帮忙。

令人震惊的是,输入的时候,我们需要把 ii 和 jj 反过来。这个问题是伟大的队友帮我调题的时候告诉我的。

当然,在听到这个消息后,我百思不得其解。然后我把这个数组输出了。于是,我惊奇地发现,这样输入竟然跟正常输入不一样。

但是,这样输入的确是能 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。

2023/10/29 08:06
加载中...