# Greedy# Array# Simulation

d132 - 00340 - Master-Mind Hints

🔗 前往 ZeroJudge 原題

題目描述

題目描述了 Master-Mind 遊戲,要求模擬出題者的行為,針對解題者的每次猜測,計算並輸出 A (位置和數字都正確) 和 B (數字正確但位置錯誤) 的數量。

解題思路

程式碼直接模擬了 Master-Mind 遊戲的規則。首先讀取密碼,然後進入迴圈讀取猜測。對於每次猜測,程式碼首先計算 A 的數量,即位置和數字都相同的數字個數。然後計算 B 的數量,即數字相同但位置不同的數字個數。計算 B 的數量時,需要注意每個密碼數字和猜測數字最多只能配對一次。程式碼使用 used 陣列來記錄密碼數字是否已被配對。

複雜度分析

  • 時間複雜度: O(n^2 * g),其中 n 是密碼長度,g 是猜測次數。因為對於每次猜測,需要遍歷密碼和猜測陣列來計算 A 和 B 的數量。
  • 空間複雜度: O(n),主要用於儲存密碼、猜測和 used 陣列。

程式碼

#include <iostream>
using namespace std;
int ans[1005],n,a[1005],ca;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> n){
		if(n==0)break;
		for(int i=0;i<n;++i){
			cin >> ans[i];
		}
		cout << "Game " << ++ca << ":\n";  
		while(1){
			int t=0;
			for(int i=0;i<n;++i){
				cin >> a[i];
				if(a[i])t=1;
			}
			if(t==0)break;
			int used[1005]={0},aa=0,bb=0;
			for(int i=0;i<n;++i){
				if(ans[i]==a[i]){
					used[i]=1;
					a[i]=-1;
					++aa;
				}
			}
			for(int i=0;i<n;++i){
				if(a[i]!=-1){
					for(int j=0;j<n;++j){
						if(used[j]==0&&a[i]==ans[j]){
							used[j]=1;
							++bb;
							j=n;
						}
					}
				}
			}
			cout << "    (" << aa << "," << bb << ")\n";
		}
	}
}

Discussion