📅  最后修改于: 2023-12-03 15:12:41.331000             🧑  作者: Mango
这道题目来自于GATE-CS-2005考试,是一道关于门的程序问题。
给定一个N个门的房子布局,门分为三种类型,分别是:
现在,你需要写一个程序,找到一个最短的路径,从入口门(represented by 0)到安全门(represented by -1),并且在途中不经过其他任何门。
输入的第一行包含一个整数T(1 <= T <= 10),表示测试用例的数量。
对于每个测试用例,第一行包含单个整数N(1 <= N <= 10^5),表示门的数量。
接下来的N行中,第i行包含单个整数ti(-1 <= ti <= 1),表示门的类型。
对于每个测试用例,输出一行,包含两个整数,分别代表从入口门到安全门的最短路径长度,以及这条路径包含的门的数量。
如果没有从入口门到安全门的路径,输出"impossible"。
2
5
0
1
0
-1
0
4
0
9
0
2
2 1
impossible
这道题目可以使用广度优先搜索(BFS)来实现。
首先,将入口门加入队列中。然后,对于队列中的每个门,遍历其四个邻居(上、下、左、右),判断是否符合要求(对应的是不是 "通往其他房子的门")。如果符合要求,将其加入队列,并标记为已访问过的门。
在这个过程中,可以将距离加以记录(距离包括从入口门到这个门的距离,以及从入口门到当前门经过的门的数量)。这样,当访问到安全门时,就可以直接输出距离和经过门的数量。
另外,题目中还要求路径上不能经过其他门。为了实现这个条件,需要在遍历当前门的邻居时,同时检查是否经过了其他门。如果经过了其他门,那么就不能将这些门相邻的门加入队列。
下面是Python3实现的代码: