# Array# Simulation# Greedy# Iteration

d431 - 第三題: 賓果遊戲 (bingo)

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬賓果遊戲,讀取兩個 5x5 的賓果卡 (A 和 B) 以及 25 個叫號數字的順序。在每次叫號後,檢查 A 和 B 是否達到賓果 (一行、一列或對角線全為 0)。輸出最先達到賓果的一方 (A 或 B 或 AB 平手) 以及達成賓果的最後一個叫號數字。

解題思路

程式使用兩個 5x5 的陣列 ab 分別儲存賓果卡 A 和 B。程式讀取 25 個叫號數字,每次叫號後,在 ab 中將對應的數字設為 0。然後,程式檢查 ab 是否達到賓果。檢查賓果的條件包括:

  1. 檢查主對角線和副對角線是否全為 0。
  2. 檢查每一行是否全為 0。
  3. 檢查每一列是否全為 0。 如果 A 先達到賓果,則輸出 "A" 和最後一個叫號數字。如果 B 先達到賓果,則輸出 "B" 和最後一個叫號數字。如果 A 和 B 同時達到賓果,則輸出 "AB" 和最後一個叫號數字。

複雜度分析

  • 時間複雜度: O(n^3),其中 n 是賓果卡的大小 (本題為 5)。因為有 25 次叫號,每次叫號需要遍歷 5x5 的陣列來尋找數字並設為 0,然後需要遍歷陣列來檢查賓果。
  • 空間複雜度: O(n^2),因為需要儲存兩個 5x5 的賓果卡。

程式碼

#include <iostream>
using namespace std;
int a[5][5],b[5][5],t,ba,bb,sum3,sum4;
int main(){
	for(int i=0;i<5;++i)
		for(int j=0;j<5;++j)
			cin >> a[i][j];
	for(int i=0;i<5;++i)
		for(int j=0;j<5;++j)
			cin >> b[i][j];
	for(int i=0;i<25;++i){
		cin >> t;
		for(int i=0;i<5;++i)
			for(int j=0;j<5;++j)
				if(t==a[i][j]){
					a[i][j]=0;
					i=5;j=5;
				}
		for(int i=0;i<5;++i)
			for(int j=0;j<5;++j)
				if(t==b[i][j]){
					b[i][j]=0;
					i=5;j=5;
				}
		sum3=0;sum4=0;
		for(int j=0;j<5;++j){
			sum3+=a[j][j];
			sum4+=a[j][4-j];
		}
		if(sum3==0)++ba;
		if(sum4==0)++ba;
		for(int i=0;i<5;++i){
			int sum=0,sum2=0;
			for(int j=0;j<5;++j){
				sum+=a[i][j];
				sum2+=a[j][i];
			}
			if(sum==0)++ba;
			if(sum2==0)++ba;
		}
		sum3=0;sum4=0;
		for(int j=0;j<5;++j){
			sum3+=b[j][j];
			sum4+=b[j][4-j];
		}
		if(sum3==0)++bb;
		if(sum4==0)++bb;
		for(int i=0;i<5;++i){
			int sum=0,sum2=0;
			for(int j=0;j<5;++j){
				sum+=b[i][j];
				sum2+=b[j][i];
			}
			if(sum==0)++bb;
			if(sum2==0)++bb;
		}
		if(ba>=5&&bb>=5){
			cout << "AB " << t ;
			break;
		}
		else if(ba>=5){
			cout << "A " << t;
			break;
		}
		else if(bb>=5){
			cout << "B " << t;
			break;
		}
		ba=0;bb=0;
	}
}

Discussion