📜  门| GATE CS 2020 |问题 24(1)

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

门| GATE CS 2020 |问题 24 简介

问题描述:

有两个门,门1和门2,都有以下三种状态:"关闭","打开-自动"和"打开-手动"。对于每个门,可以进行以下操作之一:

  • 行动1:如果门处于关闭状态,则将其置于打开-自动状态。如果门处于打开-自动状态,则将其置于关闭状态。否则,不执行任何操作。
  • 行动2:如果门处于关闭状态,则将其置于打开-手动状态。否则,不执行任何操作。
  • 行动3:如果门处于打开-手动状态,则将其置于关闭状态。否则,不执行任何操作。

现在,在这两个门的初始状态不同的情况下,给出了一个由以逗号分隔的行动组成的操作序列。你的任务是确定执行完该操作序列后第一个门是否满足以下条件之一:

  • 如果存在一次操作在第一个门上被执行,则操作序列中第一个门首次变为打开-手动状态。
  • 如果不存在一个这样的操作,则序列中第一个门首次变为打开-自动状态。

注意:

  • 操作序列对于第二个门没有任何作用,也不考虑第二个门的状态。
  • 在每个动作之间,每个门的状态都会记录下来。

输入: 第一个行包含两个整数mn,分别表示两个门的初始状态 ("打开-自动"为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
解析

我们可以采用模拟的方式来求解,根据题目条件实现相应的逻辑即可。

我们可以按照以下步骤来解答该问题:

  1. 定义一个列表doors,表示门的状态。doors[0]表示第一扇门的状态,doors[1]表示第二扇门的状态。
  2. 定义一个标记first_door_open_manual=false,表示第一扇门是否首次变为"打开-手动"状态。
  3. 对于每一个行动序列,根据题目条件对doors数组进行修改,并根据情况更新first_door_open_manual标记。
  4. 最终,如果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;
}