# Conditional Statements# Array# Bit Manipulation

g275 - 1. 七言對聯

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的七言對聯是否違反了三個規則: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";
		}
	}
}

Discussion