# APCS實作題2021年9月第1題:七言對聯
> 日期:2023年9月15日
> 作者:王一哲
> 題目來源:110年9月實作題第1題
> [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=g275)
<br />
## 題目
### 問題描述
中文依照發音方式可以分為平聲與仄聲,假設我們把平聲標記為 $0$ 而仄聲標記為 $1$。
一個七言對聯包含兩個句子,每個句子包含恰好七個字。
七言對聯有三個限制:
A. 二四不同二六同:每一句第二、四個字必須不同平仄,而第二、六個字必須相同平仄。
B. 仄起平收:第一句的結尾必須為仄聲,第二句的結尾必須為平聲。
C. 上下相對:第一、二句的第二、四、六個字平仄必須不同
給你 $n$ 組對聯,分別用 $0$、$1$ 代表平仄,請輸出它違反了哪幾條規則,若以上規則皆無違反,請輸出None
<br />
### 輸入說明
輸入一個正整數 $n$ 代表對聯數量,接下來有 $2n$ 行,每行有 $7$ 個數字,數字不是 $0$ 就是 $1$。
<br />
### 輸出說明
對於每個對聯,輸出一行表示它違反了哪些規則,若三個規則都遵守則輸出 None。
<br />
### 範例一:輸入
```
1
1 1 0 0 0 1 1
1 0 0 0 1 1 0
```
### 範例一:正確輸出
```
AC
```
<br />
### 範例二:輸入
```
1
0 1 1 0 1 1 1
1 0 1 1 0 0 0
```
### 範例二:正確輸出
```
None
```
<br />
### 範例三:輸入
```
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
```
<br />
## Python 程式碼
於 ZeroJudge 測試結果,最長運算時間約為 20 ms,使用記憶體最多約為 3.4 MB,通過測試。
```python=
n = int(input())
for _ in range(n):
first = list(map(int, input().split())) # 第一句
second = list(map(int, input().split())) # 第二句
ans = "" # 答案
# 若違反規則A,則 ans 加上 A
if first[1] == first[3] or first[1] != first[5] or second[1] == second[3] or second[1] != second[5]: ans += "A"
# 若違反規則B,則 ans 加上 B
if first[6] == 0 or second[6] == 1: ans += "B"
# 若違反規則C,則 ans 加上 C
if first[1] == second[1] or first[3] == second[3] or first[5] == second[5]: ans += "C"
# 若 ans 長度為0,表示符合所有規則,ans 重設為 None
if len(ans) == 0: ans = "None"
# 印出 ans
print(ans)
```
<br /><br />
## C++ 程式碼
於 ZeroJudge 測試結果,最長運算時間約為 3 ms,使用記憶體最多約為 340 kB,通過測試。
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main() {
int n; cin >> n;
for(int i=0; i<n; i++) {
int first[7], second[7];
for(int j=0; j<7; j++) {
cin >> first[j]; // 第一句
}
for(int j=0; j<7; j++) {
cin >> second[j]; // 第二句
}
string ans = ""; // 答案
// 若違反規則A,則 ans 加上 A
if (first[1] == first[3] || first[1] != first[5] || second[1] == second[3] || second[1] != second[5]) ans += "A";
// 若違反規則B,則 ans 加上 B
if (first[6] == 0 || second[6] == 1) ans += "B";
// 若違反規則C,則 ans 加上 C
if (first[1] == second[1] || first[3] == second[3] || first[5] == second[5]) ans += "C";
// 若 ans 是空字串,表示符合所有規則,ans 重設為 None
if (ans.empty()) ans = "None";
// 印出 ans
cout << ans << endl;
}
return 0;
}
```
<br /><br />
---
###### tags:`APCS`、`Python`、`C++`