題目請參考 https://zerojudge.tw/ShowProblem?problemid=j540.
這題是要根據猜題者的答案給予正確的回應. 為了減化程式, 我用比較少用的union來方便做copy的動作.
union j540{
unsigned long long number;
char c[8];
}input,output,answer,check;
C++同時為了加快處理, 根據題意, 輸入字串太長或已經答對都可以優先處理, 節省時間.
scanf("%s", input.c);
if(input.c[0]=='#'){
n--;
guess_count=0;
goto_end=false;
printf("\n");
continue;
}
if(goto_end){
continue; //已經全對就不用再判斷
}
if(input.c[5]!=0){
printf("Too long\n");
continue; //已經太長就不用再判斷
}
guess_count++; //目前猜測次數+1
if(input.number == answer.number){
printf("OOOOO\nCongradulat1ons ! You guessed %d times\n", guess_count);
goto_end=true;
continue; //已經全對就不用再判斷
}
C++然後題目要求優先處理答對的O, 找到對的O就把用來比對的check中的字元換成’-‘,這樣可以避免以後又被比對到一次. 不對的就先設成X, 下一步再判斷是不是改成Y.
check.number = answer.number;//check會在下面改變,避免影響answer
int i;
for(i=0;i<5;i++){
if(input.c[i]==0){
printf("Not enough letters\n");
guess_count--; //太短不算次數
break;
}
if(input.c[i]==check.c[i]){ //這個字元猜對
output.c[i]='O';
check.c[i]='-'; //這個字元用掉了就用'-'表示
}else{
output.c[i]='X';//猜錯就先用X表示,以後再判斷是不是Y
}
}
if(i<5){
continue; //已經太短就不用再判斷
}
C++最後判斷X要不要改成Y, 每遇到一個X, 都去找check裡有沒有出現相同的字元, 有找到就算用過了, 跟之前一樣改成’-‘. X都處理完後, 結果就可以印出了.
//開始判斷所有的X是不是Y
for(i=0;i<5;i++){
if(output.c[i]=='X'){
for(int j=0;j<5;j++){
if(input.c[i]==check.c[j]){ //找到相同的字元
output.c[i]='Y';
check.c[j]='-'; //這個字元已用掉改成-
break;
}
}
}
}
output.c[5]=0;
printf("%s\n", output.c);
C++完整程式如下. AC約0.3s.
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
union j540{
unsigned long long number;
char c[8];
}input,output,answer,check;
int main(){
int n;
scanf("%s %d", answer.c, &n);
bool goto_end=false;
int guess_count=0; //目前猜測次數
while(n){
scanf("%s", input.c);
if(input.c[0]=='#'){
n--;
guess_count=0;
goto_end=false;
printf("\n");
continue;
}
if(goto_end){
continue; //已經全對就不用再判斷
}
if(input.c[5]!=0){
printf("Too long\n");
continue; //已經太長就不用再判斷
}
guess_count++; //目前猜測次數+1
if(input.number == answer.number){
printf("OOOOO\nCongradulat1ons ! You guessed %d times\n", guess_count);
goto_end=true;
continue; //已經全對就不用再判斷
}
check.number = answer.number;//check會在下面改變,避免影響answer
int i;
for(i=0;i<5;i++){
if(input.c[i]==0){
printf("Not enough letters\n");
guess_count--; //太短不算次數
break;
}
if(input.c[i]==check.c[i]){ //這個字元猜對
output.c[i]='O';
check.c[i]='-'; //這個字元用掉了就用'-'表示
}else{
output.c[i]='X';//猜錯就先用X表示,以後再判斷是不是Y
}
}
if(i<5){
continue; //已經太短就不用再判斷
}
//開始判斷所有的X是不是Y
for(i=0;i<5;i++){
if(output.c[i]=='X'){
for(int j=0;j<5;j++){
if(input.c[i]==check.c[j]){ //找到相同的字元
output.c[i]='Y';
check.c[j]='-'; //這個字元已用掉改成-
break;
}
}
}
}
output.c[5]=0;
printf("%s\n", output.c);
}
}
C++