ZeroJudge G275: 七言對聯

中文依照發音方式可以分為平聲與仄聲,假設我們把平聲標記為 0 而仄聲標記為 1。

一個七言對聯包含兩個句子,每個句子包含恰好七個字。

七言對聯有三個限制:

  • A: 二四不同二六同:每一句第二、四個字必須不同平仄,而第二、六個字必須相同平仄
  • B: 仄起平收:第一句的結尾必須為仄聲,第二句的結尾必須為平聲
  • C: 上下相對:第一、二句的第二、四、六個字平仄必須不同

給你 N 組對聯,分別用 0 和 1 代表「平」和「仄」,請輸出它違反了哪幾條規則。
若以上規則皆無違反,請輸出「None」。

範例測資

範例輸入範例輸出
輸入一個正整數 N (1 <= N <= 30),代表對聯數量,接下來有 2*N 行,每行有 7 個數字,數字不是 0 就是 1。對於每個對聯,輸出一行表示它違反了哪些規則,若三個規則都遵守則輸出「None」
1
1 1 0 0 0 1 1
1 0 0 0 1 1 0
AC
1
0 1 1 0 1 1 1
1 0 1 1 0 0 0
None
2
0 1 1 0 0 0 1
1 0 1 1 0 1 1
0 1 0 0 0 0 1
0 0 0 0 0 1 1
AB
ABC
ZeroJudge G275 範例測資

解題思路

可以使用 Vector 先將兩句對聯存起來並使用 Index (Vector 中的資料) 的方式來做判斷,依照題目的規則去做判斷即可。

範例程式碼-ZeroJudge G275: 七言對聯

#include <iostream>
#include <vector>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    cin >> N;
    for (int i = 0; i<N; i++)
    {
        vector<int>one;
        vector<int>two;
        one.push_back(-1);
        two.push_back(-1);
        bool A = false, B = false, C = false;
        for (int j = 0; j<7; j++)
        {
            int tmp;
            cin >> tmp;
            one.push_back(tmp);
        }
        for (int j = 0; j<7; j++)
        {
            int tmp;
            cin >> tmp;
            two.push_back(tmp);
        }
        if (one[2] != one[4] && one[2] == one[6] && two[2] != two[4] && two[2] == two[6]) A = true;
        if (one[7] == 1 && two[7] == 0) B = true;
        if (one[2] != two[2] && one[4] != two[4] && one[6] != two[6]) C = true;
        bool none = true;
        if (!A)
        {
            none = false;
            cout << "A";
        }
        if (!B)
        {
            none = false;
            cout << "B";
        }
        if (!C)
        {
            none = false;
            cout << "C";
        }
        if (none) cout << "None";
        cout << "\n";
    }
}

//ZeroJudge G275
//Dr. SeanXD

發佈留言