📅  最后修改于: 2023-12-03 15:42:12.477000             🧑  作者: Mango
此问题来自于GATE 2020计算机科学考试,是一道有趣的编程问题。对于程序员来说,这是一道很好的练习题,可以提高编程能力。
二维平面上有n个点。假设它们分别被编了$1,2,3,...,n$。如图所示,绿色的边代表围栏,黑色的边代表门。
现在你需要写一个程序来判断门是否连通,并返回连通的门的编号。门之间连通的意思是:门$x$和门$y$之间存在一条路径,这个路径只经过其他的门。
有两行输入,第一行是一个正整数$n$ $(3≤n≤1000)$,表示有$n$个点。接下来的一行包含$2n$个整数,第$i$个和第$i+1$个整数表示第$i/2$个点的坐标$(1\leq|x_i|,|y_i|\leq 10^6)$ $(i时为偶数)$。绝对值坐标的差不会超过$10^3$。
接下来一行是一个数组$g[i][i+1]$表示两个点之间是否有一面墙。
假设连通的门有$m$个,它们的编号为$a_1,a_2,a_3,...,a_m$。将它们以升序方式排列并在一行中输出。
输入:
5
1 1 1 4 4 4 4 1 2 2 3 3 2 3
1 2 0 3 4 0 5 2 6 3
输出:
2 3 6
该问题提供的输入信息给出了:点的坐标和两点之间是否有墙。因此可以将点之间的可达性建模成一个图问题。门之间只能经过其他的门,这意味着门之间的两点之间如果没有可达路径,则可以在这两个门之间建造一道新的墙。因此我们需要将输入信息转换为一个图,并删除不必要的墙。
算法流程如下:
有了步骤4中的墙很容易推导:通过门之间所连的墙数以及墙之间的位置等来确定。
代码实现如下所示(使用Python语言):
TODO(代码片段按照Markdown格式给出)