USACO 2.1 The Castle

来源:互联网 发布:多益网络绑定战盟 编辑:程序博客网 时间:2024/04/30 06:20

BFS用洪水填充染色。 记录每个颜色的房间数量


 然后按照从下往上,从左往右的顺序穷举一边,拆掉墙,如果墙两边的房间颜色相同,跳过。 颜色不同,把颜色所代表的房间数量相加,和答案对比,更新答案即可。


Compiling...Compile: OKExecuting...   Test 1: TEST OK [0.008 secs, 3572 KB]   Test 2: TEST OK [0.008 secs, 3572 KB]   Test 3: TEST OK [0.005 secs, 3572 KB]   Test 4: TEST OK [0.008 secs, 3572 KB]   Test 5: TEST OK [0.008 secs, 3572 KB]   Test 6: TEST OK [0.008 secs, 3704 KB]   Test 7: TEST OK [0.008 secs, 3572 KB]   Test 8: TEST OK [0.022 secs, 3704 KB]All tests OK.

/*TASK:castleLANG:C++*/#include <iostream>#include <cstdio>#include <vector>#include <queue>using namespace std; int wall[55][55]={0};vector<int>path[2510];int m, n, t=0;int my_map[55][55]={0}, colo[2510] = {0}, colo_kinds=0;int room_size[2510];const int dx[]={0,0,-1,0,1};const int dy[]={0,-1,0,1,0};const int D[] = {0,1,2,4,8}; void init(){for (int i = 1; i <= m; ++ i)for (int j = n; j != 0; -- j)my_map[j][i] = ++t;for (int i = 1; i <= n; ++ i)for (int j = 1; j <= m; ++ j){cin >> wall[i][j];for (int k = 1; k <= 4; ++ k)if (!(wall[i][j] & D[k]))path[my_map[i][j]].push_back(my_map[i + dx[k]][j + dy[k]]);}} queue<int>q;void doit(){int max_room = 0;for (int i = 1; i <= m; ++ i)for (int j = n; j != 0; -- j){int tmp = my_map[j][i];if (colo[tmp])continue;q.push(tmp);colo[tmp] = ++ colo_kinds;room_size[colo_kinds] = 1;while (!q.empty()){int now = q.front();q.pop();for (int i = 0; i != path[now].size(); ++ i){int will = path[now][i];if (!will || colo[will])continue;++ room_size[colo_kinds];colo[will] = colo_kinds;q.push(will);}max_room = max(max_room, room_size[colo_kinds]);}}cout<<colo_kinds<<endl;cout<<max_room<<endl;max_room = 0;int dir(0);int tmpx, tmpy; for (int i = 1; i <= m; ++ i)for (int j = n; j != 0; -- j){for (int k = 1; k <= 4; ++ k){int now = colo[my_map[j][i]];int will = colo[my_map[j + dx[k]][i + dy[k]]];if (now == will)continue;int tmp = room_size[now] + room_size[will];if (tmp > max_room){tmpx = j;tmpy = i;max_room = tmp;dir = k;}}}cout<<max_room<<endl;cout<<tmpx<<" "<<tmpy<<" ";if (dir == 2)cout<<'N'<<endl;else cout<<'E'<<endl;} int main(){freopen("castle.in", "r", stdin);freopen("castle.out", "w", stdout);std::ios::sync_with_stdio(false);cin >>m >> n;init();doit();return 0;}


0 0
原创粉丝点击