📅  最后修改于: 2023-12-03 15:42:12.451000             🧑  作者: Mango
问题描述:
有两个门,门1和门2,都有以下三种状态:"关闭","打开-自动"和"打开-手动"。对于每个门,可以进行以下操作之一:
现在,在这两个门的初始状态不同的情况下,给出了一个由以逗号分隔的行动组成的操作序列。你的任务是确定执行完该操作序列后第一个门是否满足以下条件之一:
注意:
输入:
第一个行包含两个整数m
和n
,分别表示两个门的初始状态 ("打开-自动"为1,"打开-手动"为2,"关闭"为0)。
第二个行包含一个正整数k
(1 <= k <= 100000),表示操作序列的长度。
第三行包含k
个数字,每个数字表示对应操作所对应的操作。
输出:
如果第一个门首次变为打开-手动状态,则输出1,否则输出0。
输入说明
第一行输入两个整数分别表示两个门的初始状态。初始状态只会是0
,1
,2
中的一个。
第二行输入一个正整数k
,表示操作序列的长度。k
满足$1 \leq k \leq 100000$。
第三行输入k
个数字,每个数字表示对应操作所对应的操作。每个数字只会是1
,2
,3
中的一个。
输出说明
如果第一个门首次变为打开-手动状态,则输出1
,否则输出0
。
示例输入
2 1
8
1 1 2 1 3 3 2 2
示例输出
1
我们可以采用模拟的方式来求解,根据题目条件实现相应的逻辑即可。
我们可以按照以下步骤来解答该问题:
doors
,表示门的状态。doors[0]
表示第一扇门的状态,doors[1]
表示第二扇门的状态。first_door_open_manual=false
,表示第一扇门是否首次变为"打开-手动"状态。doors
数组进行修改,并根据情况更新first_door_open_manual
标记。first_door_open_manual=true
,则说明第一扇门首次变为"打开-手动"状态。在上面的思路中,第3步应该实现详细。
下面就给出C++的解答:
#include <bits/stdc++.h>
using namespace std;
int main() {
int door1, door2, k, action;
cin >> door1 >> door2 >> k;
int doors[2] = {door1, door2}; // 门的状态数组
bool first_door_open_manual = false; // 第一扇门是否首次变为"打开-手动"
for (int i = 0; i < k; ++i) {
cin >> action;
// 处理第一扇门
if (action == 1) {
if (doors[0] == 0) { // 关闭状态
doors[0] = 1;
} else if (doors[0] == 1) { // 打开-自动状态
doors[0] = 0;
}
} else if (action == 2) {
if (doors[0] == 0) { // 关闭状态
doors[0] = 2;
}
if (doors[0] == 2 && !first_door_open_manual) {
first_door_open_manual = true;
// 注意这里第一扇门变为"打开-自动状态"時,不需要更新first_door_open_manual
} else if (doors[0] == 1) {
doors[0] = 0;
}
} else if (action == 3) {
if (doors[0] == 2) { // 打开-手动状态
doors[0] = 0;
}
}
}
if (first_door_open_manual) {
cout << "1" << endl;
} else {
cout << "0" << endl;
}
return 0;
}
以上代码片段需按markdown格式标明。
```C++
#include <bits/stdc++.h>
using namespace std;
int main() {
int door1, door2, k, action;
cin >> door1 >> door2 >> k;
int doors[2] = {door1, door2}; // 门的状态数组
bool first_door_open_manual = false; // 第一扇门是否首次变为"打开-手动"
for (int i = 0; i < k; ++i) {
cin >> action;
// 处理第一扇门
if (action == 1) {
if (doors[0] == 0) { // 关闭状态
doors[0] = 1;
} else if (doors[0] == 1) { // 打开-自动状态
doors[0] = 0;
}
} else if (action == 2) {
if (doors[0] == 0) { // 关闭状态
doors[0] = 2;
}
if (doors[0] == 2 && !first_door_open_manual) {
first_door_open_manual = true;
// 注意这里第一扇门变为"打开-自动状态"時,不需要更新first_door_open_manual
} else if (doors[0] == 1) {
doors[0] = 0;
}
} else if (action == 3) {
if (doors[0] == 2) { // 打开-手动状态
doors[0] = 0;
}
}
}
if (first_door_open_manual) {
cout << "1" << endl;
} else {
cout << "0" << endl;
}
return 0;
}