# Array# Simulation# Greedy

d914 - 2. 圍棋資料庫比對

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算兩個圍棋棋盤的相異程度。相異程度的計算方式是:如果一個棋盤在某個座標有棋子,而另一個棋盤沒有,則相異程度加 1;如果一個棋盤是黑子,另一個棋盤是白子,則相異程度加 2。

解題思路

本題可以使用二維陣列來模擬棋盤。a1a2 分別代表兩個棋盤。陣列中的值表示棋子的顏色,0 表示沒有棋子,1 表示黑子,2 表示白子。 首先,讀取兩個棋盤的棋子資訊,並將其記錄在 a1a2 陣列中。然後,遍歷棋盤的每個座標,比較兩個棋盤在該座標上的棋子情況,並根據題目描述計算相異程度。

複雜度分析

  • 時間複雜度: O(n + m + 21 * 21),其中 n 和 m 分別是兩個棋盤的棋子數量。由於棋盤大小固定為 21x21,因此時間複雜度可以簡化為 O(n + m)。
  • 空間複雜度: O(21 * 21),即 O(1),因為棋盤大小固定。

程式碼

#include <iostream>
using namespace std;
int a1[21][21],a2[21][21],n,x,y,b,ans;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	while(n--){
		cin >> x >> y >> b;
		a1[x][y]=b+1;
	}
	cin >> n;
	while(n--){
		cin >> x >> y >> b;
		a2[x][y]=b+1;
	}
	for(int i=0;i<21;++i){
		for(int j=0;j<21;++j){
			if(a1[i][j]+a2[i][j]==3){
				ans+=2;
			}
			else if((a1[i][j]&&!a2[i][j])||(!a1[i][j]&&a2[i][j])){
				++ans;
			}
		}
	}
	cout << ans;
}

Discussion