2011年12月9日 星期五

a291: nAnB problem

內容 :
    我們常用數字密碼鎖來保護重要的東西,但要是不小心忘了密碼麻煩就大了!
    以四位數字的密碼鎖為例,我們最多要嘗試10^4=10000次才能解鎖。這時候要是
    有辦法知道目前嘗試的密碼錯了幾個字,那解鎖的速度就快多了。請寫一個程式,
    可以判斷每組數字跟正確答案差了幾個字。

輸入說明 :
    多筆輸入。
    第一行有四個介於0-9之間的數字,代表正確的密碼
    第二行有一個整數n,1<=n<=10000,代表接下來嘗試n組密碼
    接下來有n行,每行有四個介於0-9之間的數字,每行各代表一組嘗試的密碼。

輸出說明 :
    輸出n行。
    對於每組嘗試的密碼,若有p個數字的值正確,且在正確的位子上,
    另外有q個數字的值正確,但不在正確的位子上,
    輸出pAqB。
    範例見測資。

範例輸入 :
1 2 3 4
4
1 1 4 5
1 2 4 3
1 1 4 4
4 3 2 1

1 1 1 5
4
1 1 1 1
0 9 2 8
1 5 2 3
1 1 5 1

範例輸出 :
1A1B
2A2B
2A0B
0A4B
3A0B
0A0B
1A1B
2A2B

程式碼 :
#include<stdio.h>
int main()
{
    int a,b,i,j,n,ans[4],input[4],check[4];
    while(scanf("%d %d %d %d",&ans[0],&ans[1],&ans[2],&ans[3])==4)
    {
        scanf("%d",&n);
        while(n--)
        {
            a = b = 0;
            for(i=0; i<4; i++)
            {
                scanf("%d",&input[i]);
                if(ans[i] == input[i])
                {
                    a++;
                    check[i] = 1;
                }
                else
                    check[i] = 0;
            }
            for(i=0; i<4; i++)
                if(check[i] != 1)
                    for(j=0; j<4; j++)
                        if(check[j]==0 && (input[i] == ans[j]) && j!=i)
                        {
                            b++;
                            check[j] = 2;
                            break;
                        }
            printf("%dA%dB\n",a,b);
        }
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=a291

8 則留言:

  1. 可以講解一下嗎 感謝~

    回覆刪除
    回覆
    1. 第11~21行 為判斷有幾個A,如果有A的話我用check[i]來記錄這一格是已經判斷過的,這樣再判斷B時才不會重複判斷。
      第22~30行 為判斷有幾個B,比較重要的是第25行,首先要判斷的數字不能是A或B(check[j]==0),且數字必須相同(input[i] == ans[j]),最重要的是位置要不一樣(j!=i)。

      刪除
  2. 感謝您的回答,那想再請問一下,第一行是宣告變數和陣列嗎?
    本人為初學者,不太熟悉陣列。而我是用code clock編譯
    跑出執行檔後按照題目的方式輸入為何沒法輸出呢 是我的輸入方法錯了嗎?
    感謝~

    回覆刪除
    回覆
    1. 第一行 #include 是我們會用到系統些好的function,例如:scanf,printf等
      第四行 才是宣告變數與陣列
      最後我不認識code clock,這是IDE嗎?

      刪除
  3. 喔~我知道了 感謝

    抱歉 筆誤 是Code Blocks

    回覆刪除
  4. 你的程式碼在DEVC++跑的答案是錯的耶,然後用你的加我的就對了ㄟ==
    #include
    #include
    #include
    /*對於每組嘗試的密碼,若有p個數字的值正確,且在正確的位子上,
    另外有q個數字的值正確,但不在正確的位子上,輸出pAqB。*/
    using namespace std;
    int i,j,k,m,number,correct=0,the_same=0;
    int code[4],check[4];

    int main(){
    i=0;
    while(i<4){
    cin>>code[i];i++;
    }
    cin>>number;
    int test[number][4];
    for(i=0;i>test[i][j];
    }
    }
    for(i=0;i<number;i++){
    for(j=0;j<4;j++){
    if(test[i][j]==code[j]){
    correct++;
    check[j]=1;
    }
    else{
    check[j]=0;
    }
    }
    for(k=0;k<4;k++){
    if(check[k]!=1){
    for(m=0;m<4;m++){
    if(check[m]==0 && (test[i][k]==code[m]) && k!=m){
    the_same++;
    check[m]=2;
    /*如果code的位置已確認過有,則將此位置
    去除不再比對(此動作是避免重複問題)*/
    break;
    }
    }
    }
    }
    cout<<correct<<"A"<<the_same<<"B"<<endl;
    correct=0,the_same=0;
    }
    }

    回覆刪除