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 }

猜你喜欢

转载自www.cnblogs.com/Fo0o0ol/p/10106224.html
今日推荐