#include <stdio.h>
#include <stdbool.h>
#define MAX_N 10
#define MAX_M 256
int board[MAX_N][MAX_M][MAX_M]; // 玩家 i 的 m x m 賓果盤
int rowMark[MAX_N][MAX_M]; // 記錄每列被標記數
int colMark[MAX_N][MAX_M]; // 記錄每欄被標記數
int diag1Mark[MAX_N]; // 主對角線
int diag2Mark[MAX_N]; // 副對角線
bool marked[MAX_N][MAX_M][MAX_M]; // 標記哪些格子已被喊中
int pos[MAX_N][MAX_M * MAX_M][2]; // 編號對應的位置 [row][col]
int main() {
int n, m;
// 讀入每位玩家的賓果盤,並建立編號的位置對應表
for (int p = 0; p < n; p++) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
int num;
board[p][i][j] = num;
pos[p][num][0] = i;
pos[p][num][1] = j;
}
}
}
int total = m * m;
int call;
bool winFlag[MAX_N] = {false};
int winners[MAX_N];
int winnerCount = 0;
for (int t = 0; t < total; t++) {
for (int p = 0; p < n; p++) {
int i = pos[p][call][0];
int j = pos[p][call][1];
// 如果這個數字在這位玩家的盤面上
if (!marked[p][i][j]) {
marked[p][i][j] = true;
rowMark[p][i]++;
colMark[p][j]++;
if (i == j) diag1Mark[p]++;
if (i + j == m - 1) diag2Mark[p]++;
}
if (!winFlag[p] && (rowMark[p][i] == m || colMark[p][j] == m ||
diag1Mark[p] == m || diag2Mark[p] == m)) {
winFlag[p] = true;
winners[winnerCount++] = p;
}
}
if (winnerCount > 0) {
for (int i = 0; i < winnerCount; i++) {
printf("%d%c", winners
[i
], (i
== winnerCount
- 1) ? '\n' : ' '); }
break;
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CgojZGVmaW5lIE1BWF9OIDEwCiNkZWZpbmUgTUFYX00gMjU2CgppbnQgYm9hcmRbTUFYX05dW01BWF9NXVtNQVhfTV07ICAgICAgICAgLy8g546p5a62IGkg55qEIG0geCBtIOizk+aenOebpAppbnQgcm93TWFya1tNQVhfTl1bTUFYX01dOyAgICAgICAgICAgICAgLy8g6KiY6YyE5q+P5YiX6KKr5qiZ6KiY5pW4CmludCBjb2xNYXJrW01BWF9OXVtNQVhfTV07ICAgICAgICAgICAgICAvLyDoqJjpjITmr4/mrITooqvmqJnoqJjmlbgKaW50IGRpYWcxTWFya1tNQVhfTl07ICAgICAgICAgICAgICAgICAgIC8vIOS4u+Wwjeinkue3mgppbnQgZGlhZzJNYXJrW01BWF9OXTsgICAgICAgICAgICAgICAgICAgLy8g5Ymv5bCN6KeS57eaCmJvb2wgbWFya2VkW01BWF9OXVtNQVhfTV1bTUFYX01dOyAgICAgICAvLyDmqJnoqJjlk6rkupvmoLzlrZDlt7LooqvllorkuK0KaW50IHBvc1tNQVhfTl1bTUFYX00gKiBNQVhfTV1bMl07ICAgICAgIC8vIOe3qOiZn+WwjeaHieeahOS9jee9riBbcm93XVtjb2xdCgppbnQgbWFpbigpIHsKICAgIGludCBuLCBtOwogICAgc2NhbmYoIiVkICVkIiwgJm4sICZtKTsKCiAgICAvLyDoroDlhaXmr4/kvY3njqnlrrbnmoTos5Pmnpznm6TvvIzkuKblu7rnq4vnt6jomZ/nmoTkvY3nva7lsI3mh4nooagKICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbjsgcCsrKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICAgICAgICAgIGludCBudW07CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCAmbnVtKTsKICAgICAgICAgICAgICAgIGJvYXJkW3BdW2ldW2pdID0gbnVtOwogICAgICAgICAgICAgICAgcG9zW3BdW251bV1bMF0gPSBpOwogICAgICAgICAgICAgICAgcG9zW3BdW251bV1bMV0gPSBqOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGludCB0b3RhbCA9IG0gKiBtOwogICAgaW50IGNhbGw7CiAgICBib29sIHdpbkZsYWdbTUFYX05dID0ge2ZhbHNlfTsKICAgIGludCB3aW5uZXJzW01BWF9OXTsKICAgIGludCB3aW5uZXJDb3VudCA9IDA7CgogICAgZm9yIChpbnQgdCA9IDA7IHQgPCB0b3RhbDsgdCsrKSB7CiAgICAgICAgc2NhbmYoIiVkIiwgJmNhbGwpOwogICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbjsgcCsrKSB7CiAgICAgICAgICAgIGludCBpID0gcG9zW3BdW2NhbGxdWzBdOwogICAgICAgICAgICBpbnQgaiA9IHBvc1twXVtjYWxsXVsxXTsKCiAgICAgICAgICAgIC8vIOWmguaenOmAmeWAi+aVuOWtl+WcqOmAmeS9jeeOqeWutueahOebpOmdouS4igogICAgICAgICAgICBpZiAoIW1hcmtlZFtwXVtpXVtqXSkgewogICAgICAgICAgICAgICAgbWFya2VkW3BdW2ldW2pdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJvd01hcmtbcF1baV0rKzsKICAgICAgICAgICAgICAgIGNvbE1hcmtbcF1bal0rKzsKICAgICAgICAgICAgICAgIGlmIChpID09IGopIGRpYWcxTWFya1twXSsrOwogICAgICAgICAgICAgICAgaWYgKGkgKyBqID09IG0gLSAxKSBkaWFnMk1hcmtbcF0rKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF3aW5GbGFnW3BdICYmIChyb3dNYXJrW3BdW2ldID09IG0gfHwgY29sTWFya1twXVtqXSA9PSBtIHx8CiAgICAgICAgICAgICAgICBkaWFnMU1hcmtbcF0gPT0gbSB8fCBkaWFnMk1hcmtbcF0gPT0gbSkpIHsKICAgICAgICAgICAgICAgIHdpbkZsYWdbcF0gPSB0cnVlOwogICAgICAgICAgICAgICAgd2lubmVyc1t3aW5uZXJDb3VudCsrXSA9IHA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh3aW5uZXJDb3VudCA+IDApIHsKICAgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgY2FsbCk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lubmVyQ291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCVjIiwgd2lubmVyc1tpXSwgKGkgPT0gd2lubmVyQ291bnQgLSAxKSA/ICdcbicgOiAnICcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoK