# Greedy# String Manipulation# Simulation

c276 - 沒有手機的下課時間

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬一個猜數字遊戲,給定一個四位數的答案和一系列猜測,對於每個猜測計算 A 和 B 的數量,並輸出結果。A 代表猜測數字與答案數字在相同位置上且數值相同的數字個數,B 代表猜測數字與答案數字數值相同但位置不同的數字個數。

解題思路

程式碼直接模擬了遊戲的規則。對於每次猜測,程式碼首先計算 A 的數量,然後計算 B 的數量。計算 A 的數量時,直接比較猜測數字和答案數字在相同位置上的數值是否相同。計算 B 的數量時,先將 A 的位置標記為已匹配,然後再比較猜測數字和答案數字的數值是否相同,如果相同且位置不同,則將 B 的數量加一。

複雜度分析

  • 時間複雜度: O(n * k),其中 n 是猜測次數,k 是數字的位數 (本題為 4)。因為對於每次猜測,都需要遍歷數字的每一位進行比較。
  • 空間複雜度: O(1),程式碼只使用了常數級別的額外空間。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a,b,c;
	int n,A=0,B=0;
	while(cin >> c){
		cin >> n;
		for(;n>0;n--){
			a[0]=c[0];
			a[1]=c[1];
			a[2]=c[2];
			a[3]=c[3];
			cin >> b;
			if(b[0]==a[0]){
				a[0]='a';b[0]='a';A++;
			} 
			if(b[1]==a[1]){
				a[1]='a';b[1]='a';A++;
			} 
			if(b[2]==a[2]){
				a[2]='a';b[2]='a';A++;
			} 
			if(b[3]==a[3]){
				a[3]='a';b[3]='a';A++;
			} 
			if(A<4){
				if(b[0]!='a'){
					if(b[0]==a[1]){
						b[0]='a';a[1]='a';B++;
					}
					else if(b[0]==a[2]){
						b[0]='a';a[2]='a';B++;
					}
					else if(b[0]==a[3]){
						b[0]='a';a[3]='a';B++;
					}
				}
				if(b[1]!='a'){
					if(b[1]==a[0]){
						b[1]='a';a[0]='a';B++;
					}
					else if(b[1]==a[2]){
						b[1]='a';a[2]='a';B++;
					}
					else if(b[1]==a[3]){
						b[1]='a';a[3]='a';B++;
					}
				}
				if(b[2]!='a'){
					if(b[2]==a[1]){
						b[2]='a';a[1]='a';B++;
					}
					else if(b[2]==a[0]){
						b[2]='a';a[0]='a';B++;
					}
					else if(b[2]==a[3]){
						b[2]='a';a[3]='a';B++;
					}
				}
				if(b[3]!='a'){
					if(b[3]==a[1]){
						b[3]='a';a[1]='a';B++;
					}
					else if(b[3]==a[0]){
						b[3]='a';a[0]='a';B++;
					}
					else if(b[3]==a[2]){
						b[3]='a';a[2]='a';B++;
					}
				}
			}
			printf("%dA%dB\n",A,B);
			A=0;B=0;
		}
	}
}

Discussion