📜  门| GATE-CS-2005 |问题27(1)

📅  最后修改于: 2023-12-03 15:12:41.331000             🧑  作者: Mango

门 | GATE-CS-2005 | 问题27

这道题目来自于GATE-CS-2005考试,是一道关于门的程序问题。

题目描述

给定一个N个门的房子布局,门分为三种类型,分别是:

  1. 通往其他房子的门(represented by 1)
  2. 死胡同(represented by 0)
  3. 安全门(represented by -1)

现在,你需要写一个程序,找到一个最短的路径,从入口门(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实现的代码: