# String# Greedy# Array

j540 - Wordle

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬 Wordle 遊戲的判斷邏輯。給定一個五字母的目標單字,以及多個玩家的猜測單字,對於每個猜測單字,程式需要輸出一個五位字串,其中 'O' 表示字母位置正確,'Y' 表示字母存在但位置錯誤,'X' 表示字母不存在。如果猜測正確,則輸出恭喜訊息,並記錄猜測次數。

解題思路

程式首先讀取目標單字和玩家數量。然後,對於每個玩家,程式迴圈讀取玩家的猜測單字,直到讀到 '#' 為止。對於每個猜測單字,程式首先檢查長度是否符合要求。如果長度不符合,則輸出相應的錯誤訊息。如果長度符合,則程式比較猜測單字和目標單字,找出位置正確的字母,並將其標記為 'O'。然後,程式找出存在於目標單字但位置錯誤的字母,並將其標記為 'Y'。最後,程式將所有未標記的字母標記為 'X'。如果猜測正確,則輸出恭喜訊息,並記錄猜測次數。

複雜度分析

  • 時間複雜度: O(p * n * 5),其中 p 是玩家數量,n 是每個玩家猜測的次數,5 是單字長度。最壞情況下,每個玩家猜測 n 次,每次猜測需要比較 5 個字母。
  • 空間複雜度: O(5),主要用於儲存目標單字、猜測結果字串和臨時變數。

程式碼

#include <iostream>
using namespace std;
int p;
string s,w;
int main(){
	cin.tie(0);cout.tie(0); ios::sync_with_stdio(0);
	cin >> s >> p;
	for(int ca=1;ca<=p;++ca){
		for(int ct=0,flag=0;cin >> w;cout << "\n"){
			if(w=="#")break;
			if(flag)continue;
			if(w.size()>5){
				cout << "Too long";
				continue;
			}
			else if(w.size()<5){
				cout << "Not enough letters";
				continue;
			}
			else{
				++ct;
				string t=s,ans="55555";
				int cot=0;
				for(int i=0;i<5;++i)
					if(t[i]==w[i]){
						++cot;
						ans[i]='O';
						t[i]=' ';
					}	
				for(int i=0;i<5;++i){
					if(ans[i]=='O')continue;
					bool has=0;
					for(int j=0;j<5&&!has;++j)
						if(w[i]==t[j]){
							ans[i]='Y';
							t[j]=' ';
							has=1;
						}
					if(has==0)
						ans[i]='X';
				}
				cout << ans;
				if(cot==5){
					cout << "\nCongradulat1ons ! You guessed " << ct << " times";
					flag=1;
				}
			}
		}
		cout << "\n";
	} 
}

Discussion