zerojudge j540. Wordle

題目請參考 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++

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *