2011年7月31日 星期日

d132: Q340: Master-Mind Hints

內容 :
    Master-Mind是一種2個人的遊戲。其實就是學生常玩的幾A幾B的遊戲(規則或許有些許不同)。其中一個人擔任出題者,他選一串1到9數字當作密碼(可以重複)。另一個人為解題者,他要去猜密碼為何。解題者每次猜測後,出題者以某種格式回答他這次猜的結果。
    在遊戲開始之前,雙方先協議密碼的長度,假設是n。在出題者設定密碼(s1,s2,...sn)後,由解題者來猜(g1,g2,...gn)。如果同樣位置gi=si,那解題者得到一個A。如果gi=sj,但i不等於j,那解題者得到一個B。請注意:不管是得A或得B,每個gi最多只能對應到一個sj,而且得A比得B優先。舉例說明:密碼為1 2 3 4,若猜題者猜1 1 5 6,那出題者應該回答1A0B,而不是0A1B。
    如果某個猜測得到 nA0B,那就代表猜題者完全猜中密碼了。

輸入說明 :
    輸入含有多組測試資料。每組測試資料的第一列含有1個正整數 N(N <= 1000),代表密碼的長度。第二列有N個1到9的數字,代表密碼。接下來有數量不等的猜測,每個一列,亦含有N個1到9的數字。若此猜測的N個數字均為0,代表此組測試資料結束(有此類陷阱)。
    N=0代表整個輸入結束。請參考Sample Input。

輸出說明 :
    對每一組測試資料,輸出這是第幾組。然後輸出出題者回答猜題者各個猜測的結果是幾A幾B,以(A,B)的形式表示。請參考Sample Output。

範例輸入 :
4
1 3 5 5
1 1 2 3
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
10
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0

範例輸出 :
Zerojudge的輸出
Game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
Game 2:
(2,4)
(3,2)
(5,0)
(7,0)

UVa的輸出
Game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
Game 2:
(2,4)
(3,2)
(5,0)
(7,0)

出處 :
    ACM 340 (管理:taichunmin)

程式碼 :
#include<stdio.h>

int main()
{
    int A,B,i,n,gameset,check,num[10],box[10],ans[1000],guess[1000],flag[1000];
    
    gameset = 1;
    while(scanf("%d",&n)==1)
    {
        if(n == 0)
            break;
        
        for(i=1; i<10; i++)
            box[i] = 0;
        
        for(i=0; i<n; i++)
        {
            scanf("%d",&ans[i]);    
            box[ans[i]]++;
        }
        printf("Game %d:\n",gameset++);
        while(1)
        {
            check = 0;
            for(i=0; i<n; i++)
            {
                scanf("%d",&guess[i]);
                if(guess[i] == 0)
                    check++;
                flag[i] = 0;
            }
            if(n == check)
                break;
            
            A = B = 0;
            for(i=1; i<10; i++)
                num[i] = box[i];
            
            for(i=0; i<n; i++)
                if(guess[i] == ans[i])
                {
                    A++;
                    flag[i] = 1;
                    num[guess[i]]--;
                }
            
            for(i=0; i<n; i++)
                if(num[guess[i]] > 0 && flag[i]==0)
                {
                    B++;
                    num[guess[i]]--;
                }
            //以下2選1 
            printf("    (%d,%d)\n",A,B);//ACM用
            printf("(%d,%d)\n",A,B);//zerojudge用
        }  
    }    
    return 0;
}




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

沒有留言:

張貼留言