1. 程式人生 > >Usaco Training [2.1] The Castle 搜尋

Usaco Training [2.1] The Castle 搜尋

傳送門

題目的輸出的4個資訊

前兩個很容易,dfs,bfs都可以,圖怎麼建都可以

後兩個在搜尋的時候記錄belong[i][j]和已有的size即可

程式碼應該比不少題解清晰吧

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define rep(i, a, b) for (int i = a; i <= b; ++i)
 5 
 6 const int N = 57;
 7 
 8 int m, n, a[N][N], bel[N][N], siz[N * N], cnt, mx;
9 10 int b[N][N][5], dir[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; 11 12 bool vis[N][N]; 13 14 void dfs(int x, int y) { 15 if (!vis[x][y] && x > 0 && x <= m && y > 0 && y <= n) { 16 siz[cnt]++; 17 vis[x][y] = 1; 18 bel[x][y] = cnt;
19 rep(i, 0, 3) if (!b[x][y][i]) { 20 dfs(x + dir[i][0], y + dir[i][1]); 21 } 22 } 23 } 24 25 int main() { 26 scanf("%d%d", &n, &m); 27 28 rep(i, 1, m) rep(j, 1, n) { 29 scanf("%d", &a[i][j]); 30 int t = a[i][j]; 31 b[i][j][0] = (t % 2
> 0); t -= t % 2; 32 b[i][j][1] = (t % 4 > 0); t -= t % 4; 33 b[i][j][2] = (t % 8 > 0); t -= t % 8; 34 b[i][j][3] = (t % 16 > 0); 35 } 36 37 rep(i, 1, m) rep(j, 1, n) if (!vis[i][j]) { 38 ++cnt; 39 dfs(i, j); 40 mx = max(mx, siz[cnt]); 41 } 42 43 printf("%d\n%d\n", cnt, mx); 44 45 int dx, dy; char ch; 46 rep(j, 1, n) for(int i = m; i >= 1; --i) rep(k, 0, 3) { 47 if (bel[i][j] != bel[i + dir[k][0]][j + dir[k][1]]) { 48 if (siz[bel[i][j]] + siz[bel[i + dir[k][0]][j + dir[k][1]]] > mx) { 49 mx = siz[bel[i][j]] + siz[bel[i + dir[k][0]][j + dir[k][1]]]; 50 if (k == 0) dx = i + dir[k][0], dy = j + dir[k][1], ch = 'E'; 51 else if (k == 1) dx = i, dy = j, ch = 'N'; 52 else if (k == 2) dx = i, dy = j, ch = 'E'; 53 else dx = i + dir[k][0], dy = j + dir[k][1], ch = 'N'; 54 } 55 } 56 } 57 printf("%d\n%d %d %c\n", mx, dx, dy, ch); 58 return 0; 59 }