2012-08-15 08:13:20Morris

[ZJ] a361. A. 賓果遊戲

內容 :

  在整理櫃子的時候,創創和守守發現了一疊賓果卡 (5 × 5 的方格紙上不按順序地印著 01 到 25 的數字),所以他們還沒整理完櫃子就開始玩起賓果遊戲來了。

 

  創創和守守玩賓果遊戲的方式可能和我們有點不一樣:他們會一人先抽一張賓果卡,再使用從網路上找到的某個程式輸出一組數列 (這個數列包含 25 個數字,每個數字都在 0125 之間,已經出現過的數字就不會再重複出現),然後按照數列裡數字出現的順序把賓果卡上的數字劃掉,直到其中一人的賓果卡上出現一條長度為 5 的直線、橫線或斜線為止,達成連線的人就是贏家;如果兩個人同時達成連線,則視為平手。

  仔細想想,每次都要尋找數字、再把它劃掉、還有判斷是否有人勝利,這一連串的動作其實冗長又重複,所以創創和守守現在只想知道是誰贏了遊戲,而且他們還要回去整理櫃子呢!你可以在他們整理完櫃子之前幫忙寫一個程式,判斷誰抽到的賓果卡會贏得遊戲嗎?

輸入說明 :

第一行有一個整數 T (T 50) 代表接下來有幾組測試資料。

每組測試資料包含兩張賓果卡和一組數列:前 10 列每列有 5 個數字,第 1 列到第 5 列代表第 1 張賓果卡,第 6 到第 10 列代表第 2 張賓果卡;第 11 列是由 25 個數字所組成的數列,每個數字都在 0125 之間,出現過的數字不會重複出現。

輸出說明 :

對於每組測試資料輸出哪張賓果卡會贏得遊戲,“1” 代表第 1 張,“2” 代表第 2 張,“0” 代表平手。

範例輸入 :help

2
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 05 18 19 12 08 21 15 06 10 16 03 24 20 25 13 23 11
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 13 05 18 19 12 08 21 15 06 10 16 03 24 20 25 23 11

範例輸出 :

2
0

提示 :

出處 :

2011 NPSC 國中組決賽 (管理:pcshic)

寫得不夠漂亮, 慚愧

#include <stdio.h>
int B[2][5][5];
void ban(int b[][5], int x) {
    int i, j;
    for(i = 0; i < 5; i++) {
        for(j = 0; j < 5; j++) {
            if(b[i][j] == x) {
                b[i][j] = 0;
                return;
            }
        }
    }
}
int bingo(int b[][5]) {
    int i, j;
    for(i = 0; i < 5; i++) {
        for(j = 0; j < 5; j++) {
            if(b[i][j])
                break;
        }
        if(j == 5)  return 1;
        for(j = 0; j < 5; j++) {
            if(b[j][i])
                break;
        }
        if(j == 5)  return 1;
    }
    for(i = 0; i < 5; i++)
        if(b[i][i])
            break;
    if(i == 5)  return 1;
    for(i = 0; i < 5; i++)
        if(b[4-i][i])
            break;
    if(i == 5)  return 1;
    return 0;
}
int main() {
    int t, i, j, x;
    scanf("%d", &t);
    while(t--) {
        for(i = 0; i < 5; i++) {
            for(j = 0; j < 5; j++) {
                scanf("%d", &B[0][i][j]);
            }
        }
        for(i = 0; i < 5; i++) {
            for(j = 0; j < 5; j++) {
                scanf("%d", &B[1][i][j]);
            }
        }
        int flag = -1;
        for(i = 0; i < 25; i++) {
            scanf("%d", &x);
            if(flag == -1) {
                ban(B[0], x);
                ban(B[1], x);
                int a = bingo(B[0]), b = bingo(B[1]);
                if(a && b)  flag = 0;
                if(a && !b) flag = 1;
                if(!a && b) flag = 2;
            }
        }
        printf("%d\n", flag);
    }
    return 0;
}