fork download
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. #define MAX_N 10
  5. #define MAX_M 256
  6.  
  7. int board[MAX_N][MAX_M][MAX_M]; // 玩家 i 的 m x m 賓果盤
  8. int rowMark[MAX_N][MAX_M]; // 記錄每列被標記數
  9. int colMark[MAX_N][MAX_M]; // 記錄每欄被標記數
  10. int diag1Mark[MAX_N]; // 主對角線
  11. int diag2Mark[MAX_N]; // 副對角線
  12. bool marked[MAX_N][MAX_M][MAX_M]; // 標記哪些格子已被喊中
  13. int pos[MAX_N][MAX_M * MAX_M][2]; // 編號對應的位置 [row][col]
  14.  
  15. int main() {
  16. int n, m;
  17. scanf("%d %d", &n, &m);
  18.  
  19. // 讀入每位玩家的賓果盤,並建立編號的位置對應表
  20. for (int p = 0; p < n; p++) {
  21. for (int i = 0; i < m; i++) {
  22. for (int j = 0; j < m; j++) {
  23. int num;
  24. scanf("%d", &num);
  25. board[p][i][j] = num;
  26. pos[p][num][0] = i;
  27. pos[p][num][1] = j;
  28. }
  29. }
  30. }
  31.  
  32. int total = m * m;
  33. int call;
  34. bool winFlag[MAX_N] = {false};
  35. int winners[MAX_N];
  36. int winnerCount = 0;
  37.  
  38. for (int t = 0; t < total; t++) {
  39. scanf("%d", &call);
  40. for (int p = 0; p < n; p++) {
  41. int i = pos[p][call][0];
  42. int j = pos[p][call][1];
  43.  
  44. // 如果這個數字在這位玩家的盤面上
  45. if (!marked[p][i][j]) {
  46. marked[p][i][j] = true;
  47. rowMark[p][i]++;
  48. colMark[p][j]++;
  49. if (i == j) diag1Mark[p]++;
  50. if (i + j == m - 1) diag2Mark[p]++;
  51. }
  52.  
  53. if (!winFlag[p] && (rowMark[p][i] == m || colMark[p][j] == m ||
  54. diag1Mark[p] == m || diag2Mark[p] == m)) {
  55. winFlag[p] = true;
  56. winners[winnerCount++] = p;
  57. }
  58. }
  59.  
  60. if (winnerCount > 0) {
  61. printf("%d\n", call);
  62. for (int i = 0; i < winnerCount; i++) {
  63. printf("%d%c", winners[i], (i == winnerCount - 1) ? '\n' : ' ');
  64. }
  65. break;
  66. }
  67. }
  68.  
  69. return 0;
  70. }
  71.  
  72.  
Success #stdin #stdout 0.01s 5708KB
stdin
2 3
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
1 2 4 8 6 3 9 5 7
stdout
3
0 1