j540 - Wordle
題目描述
題目要求模擬 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";
}
}