2011-06-10 21:18:29Morris

d913. 1. 彈珠配置

內容 :

「彈珠排排站」是園遊會中很受歡迎的腦力激盪遊戲攤位。基本上有 6 個不同的彈珠 (彈珠代號為1, 2, 3, 4, 5, 6) 要進行排序。遊戲剛開始 時,老闆會先選定一種彈珠排列順序當做解答,爾後遊戲者每次排好彈珠後,老闆會告知有幾個彈珠放對位置,但是不會告知是哪幾個彈珠放對或放錯位置。如果完 全正確就可以兌換贈品一份,若猜錯了,則進行下一輪的排序,不過每一次遊戲總共只有七次的排序機會。在任意猜測六次之後,你希望能自動推斷最後一次機會該 如何排序來增加獲獎的機率。請寫一個程式,在輸入前六次猜測的紀錄後,計算第七次 (最後一次) 該採用的彈珠排序方式,也就是找出一組符合前六次猜測結果的彈珠排序順序。

輸入說明 :

輸入檔共有 6 行。每行有 7 個以空白隔開的數字,前六個數字代表此輪彈珠排序順序(每個彈珠代號只會出現一次),最後一個數字代表彈珠在正確位置的個數(0 ~ 5)。

輸出說明 :

請輸出第七輪應該採用的彈珠排序方式。輸入保證至少會有一組答案,若有多組可能答案,請依字典順序(彈珠代號較小的優先)輸出第一組即可。

範例輸入 :help

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

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

範例輸出 :

輸出範例1 : 
4 3 2 1 5 6

輸出範例2 : 
1 2 3 4 5 6

提示 :

出處 :

99資訊能力競賽全國決賽 (管理:pcshic)

作法 : DFS 窮舉

/**********************************************************************************/
/*  Problem: d913 "1. 彈珠配置" from 99資訊能力競賽全國決賽         */
/*  Language: C                                                                   */
/*  Result: AC (4ms, 276KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-09 23:13:35                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
int a, b, c, Map[6][7];
int Used[7]={0}, Find=0, Way[7];
void DFS(int Now) {
    int a;
    if(Find == 1) return;
    if(Now == 6) {
        int b, t;
        for(a = 0; a < 6; a++) {
            t = 0;
            for(b = 0; b < 6; b++)
                if(Way[b] == Map[a][b]) t++;
            if(t!=Map[a][6])    break;
        }
        if(a == 6) {
            for(a = 0; a < 6; a++)
                printf("%d ", Way[a]);
                puts(""), Find = 1;
        }
        return;
    }
    for(a = 1; a <= 6; a++)
        if(Used[a] == 0) {
            Used[a] = 1, Way[Now] = a, DFS(Now+1), Used[a] = 0;
        }
}
main() {
    while(scanf("%d", &Map[0][0]) == 1) {
        for(a = 1; a < 7; a++)
            scanf("%d", &Map[0][a]);
        for(a = 1; a < 6; a++)
            for(b = 0; b < 7; b++)
                scanf("%d", &Map[a][b]);
        Find = 0, DFS(0);
    }
    return 0;
}