fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX_N 10
  5. #define MAX_M 256
  6.  
  7. int board[MAX_N][MAX_M][MAX_M];
  8. int mark[MAX_N][MAX_M][MAX_M];
  9. int posRow[MAX_N][MAX_M * MAX_M + 1];
  10. int posCol[MAX_N][MAX_M * MAX_M + 1];
  11.  
  12. int check_bingo(int player, int m) {
  13. for (int i = 0; i < m; i++) {
  14. // 檢查行
  15. int rowFull = 1, colFull = 1;
  16. for (int j = 0; j < m; j++) {
  17. if (!mark[player][i][j]) rowFull = 0;
  18. if (!mark[player][j][i]) colFull = 0;
  19. }
  20. if (rowFull || colFull)
  21. return 1;
  22. }
  23. // 檢查對角線
  24. int diag1 = 1, diag2 = 1;
  25. for (int i = 0; i < m; i++) {
  26. if (!mark[player][i][i]) diag1 = 0;
  27. if (!mark[player][i][m - 1 - i]) diag2 = 0;
  28. }
  29. return diag1 || diag2;
  30. }
  31.  
  32. int main() {
  33. int n, m;
  34. scanf("%d %d", &n, &m);
  35.  
  36. // 初始化資料
  37. memset(mark, 0, sizeof(mark));
  38. for (int p = 0; p < n; p++) {
  39. for (int i = 0; i < m; i++) {
  40. for (int j = 0; j < m; j++) {
  41. int num;
  42. scanf("%d", &num);
  43. board[p][i][j] = num;
  44. posRow[p][num] = i;
  45. posCol[p][num] = j;
  46. }
  47. }
  48. }
  49.  
  50. int callCount = m * m;
  51. int called[callCount];
  52. for (int i = 0; i < callCount; i++) {
  53. scanf("%d", &called[i]);
  54. }
  55.  
  56. int winCalledNum = -1;
  57. int winners[MAX_N] = {0}; // 用來記錄是否已贏
  58. int winPlayers[MAX_N], winCount = 0;
  59.  
  60. for (int t = 0; t < callCount; t++) {
  61. int num = called[t];
  62. for (int p = 0; p < n; p++) {
  63. int i = posRow[p][num];
  64. int j = posCol[p][num];
  65. mark[p][i][j] = 1;
  66. }
  67.  
  68. for (int p = 0; p < n; p++) {
  69. if (!winners[p] && check_bingo(p, m)) {
  70. winners[p] = 1;
  71. if (winCalledNum == -1) winCalledNum = num;
  72. }
  73. }
  74.  
  75. if (winCalledNum != -1) {
  76. break;
  77. }
  78. }
  79.  
  80. // 收集所有贏家
  81. for (int p = 0; p < n; p++) {
  82. if (winners[p])
  83. winPlayers[winCount++] = p;
  84. }
  85.  
  86. // 輸出
  87. printf("%d", winCalledNum);
  88. for (int i = 0; i < winCount; i++) {
  89. printf(" %d", winPlayers[i]);
  90. }
  91. printf("\n");
  92.  
  93. return 0;
  94. }
Success #stdin #stdout 0.01s 9768KB
stdin
3 10
45 32 72 48 65 63 73 92 99 64
12 36 82 14 21 3 68 41 4 25
83 38 57 53 81 89 16 34 2 46
75 54 69 19 43 13 40 24 60 77
70 49 95 71 50 28 59 33 98 100
80 93 90 11 61 20 26 22 88 31
8 27 91 79 52 86 66 42 62 84
15 55 74 78 67 35 97 47 1 96
94 44 7 18 39 58 5 29 23 56
10 9 76 6 37 85 17 87 30 51
1 45 50 49 16 20 83 19 12 46
55 42 18 99 76 92 26 94 41 75
87 2 3 30 34 39 97 90 11 47
59 67 21 28 70 35 93 63 17 71
38 52 57 73 85 86 23 31 33 7
13 54 6 84 37 51 74 66 40 96
81 58 10 15 43 27 95 62 36 65
56 77 82 100 68 9 53 91 22 5
72 78 69 24 25 88 98 8 29 32
4 48 14 89 80 64 60 79 61 44
29 15 88 47 9 83 63 53 33 22
31 44 62 100 41 5 79 14 70 25
96 80 32 67 89 82 3 81 98 13
20 43 37 85 34 49 19 76 46 91
2 24 16 11 26 94 4 7 10 61
93 12 78 97 39 54 64 87 51 68
58 40 69 55 45 50 60 92 1 99
72 28 77 18 59 48 65 57 27 36
52 86 42 73 56 75 23 95 74 8
21 84 38 90 71 17 35 30 66 6
59 94 16 27 68 58 79 38 17 84 21 57 5 22 73 95 2 30 64 14 49 1 87 41 29 46 96 35 54 48 85 31 42 93 3 8 88 6 37 86 18 45 75 63 24 55 47 36 97 13 23 92 78 91 40 80 32 52 39 66 12 81 34 82 67 56 33 50 4 90 62 74 51 25 76 28 20 15 7 26 44 9 83 61 77 100 69 65 89 70 71 72 98 19 43 99 10 11 53 60
stdout
33 0