由于某些原因本题仅支持 C++, C++11 语言的提交。
建筑师 Timothy 设计了一个新的密室逃脱游戏。这个游戏里有
游戏里还有
参与游戏的玩家需要收集钥匙和在不同的房间之间通过通道进行移动。当玩家使用通道
在游戏的任意时刻,玩家可以在某个房间
- 收集房间
里面的钥匙,钥匙的类型是 (除非对应类型的钥匙已经被收集过)。 - 通过通道
,需要满足 或 ,且玩家已经获得 类型的钥匙。
注意玩家收集过的钥匙可以一直使用,永远不会被丢弃。
最初玩家会在某个房间
对于每一个房间
实现细节
你必须引用 keys.h
头文件。
你要实现以下函数:
int[] find_reachable(int[] r, int[] u, int[] v, int[] c)
:一个长度为 的序列。对于每一个 ( ),第 个房间里的钥匙类型是 。 :两个长度为 的序列。对于每一个 ( ),第 条通道连接了房间 和 。 :一个长度为 的序列。对于每一个 ( ),通过通道 需要用到的钥匙类型是 。- 这个函数应该返回一个长度为
的序列 。对于 中的 ,如果满足 ( )那么 的值为 ,否则 的值为 。
输入格式
评测程序示例以如下格式读取输入数据:
- 第
行: - 第
行: - 第
行( ):
输出格式
样例评分程序按照以下格式打印 find_reachable
函数的返回值:
- 第
行:
样例一
input
4 5 0 1 1 2 0 1 0 0 2 0 1 2 1 1 3 0 3 1 2
output
0 1 1 0
explanation
考虑以下调用:
find_reachable([0, 1, 1, 2],
[0, 0, 1, 1, 3], [1, 2, 2, 3, 1], [0, 0, 1, 0, 2])
如果玩家从房间
当前房间 | 操作 |
---|---|
收集钥匙类型 |
|
通过通道 |
|
收集钥匙类型 |
|
通过通道 |
|
通过通道 |
|
通过通道 |
因此从房间
开始房间 |
可以到达的房间 | |
---|---|---|
所有房间中
样例二
input
7 10 0 1 1 2 2 1 2 0 1 0 0 2 0 1 2 1 1 3 0 2 3 0 3 4 1 3 5 2 4 5 0 4 6 2 5 6 1
output
0 1 1 0 1 0 1
explanation
考虑以下调用:
find_reachable([0, 1, 1, 2, 2, 1, 2],
[0, 0, 1, 1, 2, 3, 3, 4, 4, 5],
[1, 2, 2, 3, 3, 4, 5, 5, 6, 6],
[0, 0, 1, 0, 0, 1, 2, 0, 2, 1])
下表展示了从各个房间出发可以到达的房间集合:
开始房间 |
可以到达的房间 | |
---|---|---|
所有房间中
样例三
input
3 1 0 0 0 0 1 0
output
0 0 1
explanation
考虑以下调用:
find_reachable([0, 0, 0], [0], [1], [0])
下表展示了从各个房间出发可以到达的房间集合:
开始房间 |
可以到达的房间 | |
---|---|---|
所有房间中
数据范围
对于所有数据:
(对于所有的 ) 且 (对于所有的 ) (对于所有的 )
子任务 | 分值 | 特殊限制 |
---|---|---|
没有额外的约束条件 |
时间限制:
空间限制: