g275 - 1. 七言對聯
題目描述
題目要求判斷給定的七言對聯是否違反了三個規則:A (二四不同二六同)、B (仄起平收)、C (上下相對)。如果違反了某個規則,則輸出對應的字母;如果全部遵守,則輸出 "None"。
解題思路
程式碼使用一個二維陣列 a[7][2] 來儲存兩個句子的平仄資訊。然後,程式碼分別檢查三個規則:
- 規則 A:檢查每一句第二、四個字是否不同平仄,以及第二、六個字是否相同平仄。
- 規則 B:檢查第一句的結尾是否為仄聲,第二句的結尾是否為平聲。
- 規則 C:檢查第一、二句的第二、四、六個字平仄是否不同。
如果違反了某個規則,則將對應的字母添加到
ans字串中。最後,如果ans字串為空,則輸出 "None";否則,輸出ans字串。
複雜度分析
- 時間複雜度: O(n) (n 為對聯數量,因為程式碼需要遍歷 n 組對聯,且每組對聯的處理時間為常數時間)
- 空間複雜度: O(1) (程式碼使用的額外空間為常數,主要是儲存對聯的陣列
a[7][2],其大小固定)
程式碼
#include <iostream>
using namespace std;
int q;
bool a[7][2];
int main(){
cin >> q;
while(q--){
string ans;
int aa=0,bb=0,cc=0;
for(int j=0;j<2;++j){
for(int i=0;i<7;++i){
cin >> a[i][j];
}
}
for(int j=0;j<2;++j){
if(a[1][j]==a[3][j]||a[1][j]!=a[5][j]){
aa=1;
}
}
if(a[6][0]==0||a[6][1]==1){
bb=1;
}
for(int i=1;i<6;i+=2){
if(a[i][0]==a[i][1]){
cc=1;
}
}
if(aa)ans+='A';
if(bb)ans+='B';
if(cc)ans+='C';
if(ans==""){
cout << "None\n";
}
else{
cout << ans << "\n";
}
}
}