Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <stdint.h>
- #include <iostream>
- #include <cstring>
- #include <cmath>
- #include <vector>
- #include <string>
- #include <utility>
- using namespace std;
- const int EMPTY = 0, WHITE = 1, BLACK = 2;
- int total_black;
- int tab[20][20], n, m;
- int dirs[][2] = {
- {1, -1}, // NW
- {1, 1}, // NE
- {-1, -1}, // SW
- {-1, 1} // SE
- };
- int black_map[70], reverse_black_map[200];
- int bt(uint64_t v, int i, int j) {
- vector<pair<int, int> > neigh;
- int ii, jj;
- for (int d = 0; d < 4; d++) {
- ii = i + dirs[d][0];
- jj = j + dirs[d][1];
- while (ii >= 0 && ii < n && jj >= 0 && jj < m && !tab[ii][jj]) {
- ii += dirs[d][0];
- jj += dirs[d][1];
- }
- if (ii >= 0 && ii < n && jj >= 0 && jj < m) {
- if (tab[ii][jj] == BLACK) {
- neigh.push_back(make_pair(d, ii * m + jj));
- }
- }
- }
- int mx = __builtin_popcount((uint32_t) v) + __builtin_popcount(v >> 32);
- uint64_t vv = v;
- for (int k = 0; k < neigh.size(); k++) {
- // se já visitou...
- int id = reverse_black_map[neigh[k].second];
- uint64_t neigh_mask = 1 << id;
- if (neigh_mask & v) continue;
- vv = v | neigh_mask;
- // Essa é a posição após capturar a peça
- int d = neigh[k].first;
- ii = neigh[k].second / m + dirs[d][0];
- jj = neigh[k].second % m + dirs[d][1];
- //cout << "capturou e caiu em " << ii << " " << jj << endl;
- while (ii >= 0 && ii < n && jj >= 0 && jj < m && !tab[ii][jj]) {
- //cout << "... e sair de " << ii << " " << jj << endl;
- int tmp = bt(vv, ii, jj);
- if (tmp > mx) mx = tmp;
- ii += dirs[d][0];
- jj += dirs[d][1];
- }
- }
- return mx;
- }
- int main() {
- for (;;) {
- scanf("%d %d", &n, &m);
- if (n == 0 && m == 0) break;
- memset(tab, 0, sizeof(tab));
- memset(black_map, 0, sizeof(black_map));
- memset(reverse_black_map, -1, sizeof(reverse_black_map));
- total_black = 0;
- for (int i = 0; i < n * m; i += 2) {
- int ii = i / m;
- int jj = i % m;
- if (m % 2 == 0) jj += ii & 1;
- scanf("%d", &tab[ii][jj]);
- if (tab[ii][jj] == BLACK) {
- black_map[total_black] = ii * m + jj;
- reverse_black_map[black_map[total_black]] = total_black;
- total_black++;
- }
- }
- int mx = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (tab[i][j] == WHITE) {
- //cout << "-->saindo de " << i << " " << j << endl;
- mx = max(mx, bt(0, i, j));
- }
- }
- }
- printf("%d\n", mx);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment