#54819: c解法參考(附帶註解


fred1090037@gmail.com (Fred)


 

我的作法是先把正確答案複製一次,然後再用複製的答案比對,若比對的值一樣,則把陣列中資料改為'X'或'x',這樣就不會重複比對了

#include <stdio.h>

#include <string.h>

 

int main()

{

    char answer[10];   // 儲存正確答案

    char guess[10];    // 儲存每次猜測

    char test[10];     // 複製 answer,用來標記已經比對過的字元

    int m;             // 猜測次數

    int i ,j ,k;

    int A;             // A:位置與數字皆正確

    int B;             // B:數字正確但位置錯誤

    

    // 輸入答案與猜測次數

    scanf("%s %d",answer,&m);

 

    int lenth=strlen(answer);   // 計算答案長度

    

    // 進行 m 次猜測

    for(i=0;i<m;i++){

        

        A=0;   // 每次重新計算 A

        B=0;   // 每次重新計算 B

        

        // 將 answer 複製到 test

        // 用來在比對時標記已使用的字元

        for(j=0;j<lenth;j++){

            test[j]=answer[j];

        }

        

        // 輸入本次猜測

        scanf("%s",guess);

        

        // 計算 A(位置與數字都正確)

        for(j=0;j<lenth;j++){

            if(guess[j]==test[j]){

                

                A++;              // A +1

                test[j]='X';      // 標記 answer 該位置已使用

                guess[j]='x';     // 標記 guess 該位置已使用

                

            }

        }

        

        // 計算 B(數字正確但位置錯誤)

        for(j=0;j<lenth;j++){

            

            for(k=0;k<lenth;k++){

                

                // 若數字相同,代表為 B

                if(test[j]==guess[k]){

                    

                    test[j]='X';   // 標記 answer 的該字元已使用

                    guess[k]='x';  // 標記 guess 的該字元已使用

                    B++;           // B +1

                    

                    break;         // ★ 找到一組就停止,避免重複計算

                }

            }

        }

        

        // 輸出結果(xAyB)

        printf("%dA%dB\n",A,B);

    }

    

    return 0;

}