Guest User

Untitled

a guest
Oct 20th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #include <cstdio>
  2. #include <stdint.h>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <vector>
  7. #include <string>
  8. #include <utility>
  9. using namespace std;
  10.  
  11. const int EMPTY = 0, WHITE = 1, BLACK = 2;
  12.  
  13. int total_black;
  14. int tab[20][20], n, m;
  15. int dirs[][2] = {
  16. {1, -1}, // NW
  17. {1, 1}, // NE
  18. {-1, -1}, // SW
  19. {-1, 1} // SE
  20. };
  21.  
  22. int black_map[70], reverse_black_map[200];
  23.  
  24. int bt(uint64_t v, int i, int j) {
  25. vector<pair<int, int> > neigh;
  26. int ii, jj;
  27.  
  28. for (int d = 0; d < 4; d++) {
  29.  
  30. ii = i + dirs[d][0];
  31. jj = j + dirs[d][1];
  32. while (ii >= 0 && ii < n && jj >= 0 && jj < m && !tab[ii][jj]) {
  33. ii += dirs[d][0];
  34. jj += dirs[d][1];
  35. }
  36. if (ii >= 0 && ii < n && jj >= 0 && jj < m) {
  37. if (tab[ii][jj] == BLACK) {
  38. neigh.push_back(make_pair(d, ii * m + jj));
  39. }
  40. }
  41. }
  42.  
  43. int mx = __builtin_popcount((uint32_t) v) + __builtin_popcount(v >> 32);
  44. uint64_t vv = v;
  45. for (int k = 0; k < neigh.size(); k++) {
  46. // se já visitou...
  47. int id = reverse_black_map[neigh[k].second];
  48. uint64_t neigh_mask = 1 << id;
  49. if (neigh_mask & v) continue;
  50.  
  51. vv = v | neigh_mask;
  52.  
  53. // Essa é a posição após capturar a peça
  54. int d = neigh[k].first;
  55. ii = neigh[k].second / m + dirs[d][0];
  56. jj = neigh[k].second % m + dirs[d][1];
  57.  
  58. //cout << "capturou e caiu em " << ii << " " << jj << endl;
  59.  
  60. while (ii >= 0 && ii < n && jj >= 0 && jj < m && !tab[ii][jj]) {
  61. //cout << "... e sair de " << ii << " " << jj << endl;
  62. int tmp = bt(vv, ii, jj);
  63. if (tmp > mx) mx = tmp;
  64.  
  65. ii += dirs[d][0];
  66. jj += dirs[d][1];
  67. }
  68. }
  69. return mx;
  70. }
  71.  
  72. int main() {
  73. for (;;) {
  74. scanf("%d %d", &n, &m);
  75. if (n == 0 && m == 0) break;
  76. memset(tab, 0, sizeof(tab));
  77. memset(black_map, 0, sizeof(black_map));
  78. memset(reverse_black_map, -1, sizeof(reverse_black_map));
  79. total_black = 0;
  80.  
  81. for (int i = 0; i < n * m; i += 2) {
  82. int ii = i / m;
  83. int jj = i % m;
  84. if (m % 2 == 0) jj += ii & 1;
  85. scanf("%d", &tab[ii][jj]);
  86. if (tab[ii][jj] == BLACK) {
  87. black_map[total_black] = ii * m + jj;
  88. reverse_black_map[black_map[total_black]] = total_black;
  89. total_black++;
  90. }
  91. }
  92. int mx = 0;
  93. for (int i = 0; i < n; i++) {
  94. for (int j = 0; j < m; j++) {
  95. if (tab[i][j] == WHITE) {
  96. //cout << "-->saindo de " << i << " " << j << endl;
  97. mx = max(mx, bt(0, i, j));
  98. }
  99. }
  100. }
  101. printf("%d\n", mx);
  102. }
  103. return 0;
  104. }
Add Comment
Please, Sign In to add comment