24h購物| | PChome| 登入
2013-02-22 22:07:09| 人氣981| 回應0 | 上一篇 | 下一篇

[ZJ][模擬] a632. 12. Domino Rally

推薦 0 收藏 0 轉貼0 訂閱站台

內容 :

骨牌有一個流行的變化玩法,就是將一些 (隨機選取) 骨牌平放,一個一個頭尾相接,然後將兩個相接的點數相同 (由左至右尋找) 的骨牌移除。以下面六張骨牌為例。原本抽出了六張骨牌。

  

要注意的是骨牌在放置時,有正向及反向兩個方向。遊戲從左側開始,移除任何一對骨牌之後要回到最左邊。在本例中,由於 12 號骨牌 (正向) 及 17 號骨牌 (反向) 相接的點數都是 5 點,所以先行移除。

  

骨牌靠攏後再從左側開始。這次,15 號和 20 號 (都是正向) 被移除了,因為它們相接的點數都是 3。骨牌再次靠攏。

  

由於無法再移除任何骨牌,遊戲就此結束。注意:儘管 20 號和 11 號相接的點數都是 4 卻不能移除,因為它們不是最左邊的配對。

寫一個程式,接受一列的骨牌編號及方向,重覆移除最左邊的配對,直到沒有配對為止。

輸入說明 :

輸 入含有若干筆測資,每筆對應到一個由左至右的骨牌。一個骨牌資料包含了一個 1 到 28 的整數 (代表右圖中的骨牌編號),一個空白,及一個字元 (大寫 F 或 B) 表示骨牌的方向 (F 為正向,B 為反向)。每筆測資有 1 到 28 張骨牌,最後以 (0 F) 結束。每張骨牌都單獨一行。你可以假設在一筆測資中每張骨牌最多只出現一次,輸入資料都是正確的。

輸出說明 :

你的程式要輸出最後留下的骨牌。每筆骨牌測資輸出一行。每一行包含了在執行完所有可能的移除後所剩的骨牌編號。骨牌方向不要輸出。如果所有的骨牌都被移除,請輸出「DATASET CLEARED」。

範例輸入 :

5 B
15 F
12 F
17 B
20 F
11 B
0 F
18 F
22 B
0 F
23 F
12 B
2 B
4 F
15 B
20 B
19 B
7 B
6 F
0 F

範例輸出 :

5 11
DATASET CLEARED
19

提示 :

出處 :

HP CodeWars 2007 (管理:snail)

/**********************************************************************************/
/*  Problem: a632 "12. Domino Rally" from HP CodeWars 2007                        */
/*  Language: CPP (1243 Bytes)                                                    */
/*  Result: AC(4ms, 260KB) judge by this@ZeroJudge                                */
/*  Author: morris1028 at 2013-02-20 15:02:43                                     */
/**********************************************************************************/


#include <stdio.h>

int dice[30][2] = {
{0,0},{0,0},{0,1},{0,2},{0,3},
{0,4},{0,5},{0,6},{1,1},{1,2},
{1,3},{1,4},{1,5},{1,6},{2,2},
{2,3},{2,4},{2,5},{2,6},{3,3},
{3,4},{3,5},{3,6},{4,4},{4,5},
{4,6},{5,5},{5,6},{6,6},{0,0}};
int main() {
    int D[150], n, i, j, p, q;
    char E[150];
    do {
        n = 0;
        while(1) {
            if(scanf("%d %c", &D[n], &E[n]) != 2)
                return 0;
            if(D[n] == 0)   break;
            n++;
        }
        int update;
        do {
            update = 0;
            for(i = 1; i < n; i++) {
                if(E[i-1] == 'B')   p = dice[D[i-1]][0];
                else   p = dice[D[i-1]][1];
                if(E[i] == 'B')     q = dice[D[i]][1];
                else   q = dice[D[i]][0];
                if(p == q) {
                    update = 1;
                    for(j = i-1, i++; i < n; i++, j++)
                        D[j] = D[i], E[j] = E[i];
                    n -= 2;
                    break;
                }
            }
        } while(update);
        for(i = 0; i < n; i++)
            printf("%d ", D[i]);
        if(n == 0)  printf("DATASET CLEARED");
        puts("");
    } while(1);
    return 0;
}

台長: Morris
人氣(981) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:[ZJ] a631. 11. LED Decoder
此分類上一篇:[ZJ][bfs, dfs] a634. 14. Knights Path

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文