2014年北大校赛C&Openjudge C14C ROBOT bfs 搜索
2014-05-10 21:50
417 查看
题目链接点这儿
开始一个空图,然后机器人在上面走,会留下A或者B,而且留下的标记会覆盖之前的标记。
题目会给一个有某些机器人走过的成品图(标记已经有了),问你最少几个机器人走可以形成这些标记。
明显联通的区域肯定是一个机器人走的,而与这个联通区域相连的另一个标记的地方都可以认为是一个机器人走的。因为我们可以认为最后一个机器人走过的区域都有上一个机器人走过的地方,这样这些区域明显是联通的,所以可以认为是同一个机器人走过的地方。所以就这样一层一层的找,每找一层就相当于多了一个机器人。
复杂度为将图完全bfs一遍的复杂度o(mn)
下附代码
开始一个空图,然后机器人在上面走,会留下A或者B,而且留下的标记会覆盖之前的标记。
题目会给一个有某些机器人走过的成品图(标记已经有了),问你最少几个机器人走可以形成这些标记。
明显联通的区域肯定是一个机器人走的,而与这个联通区域相连的另一个标记的地方都可以认为是一个机器人走的。因为我们可以认为最后一个机器人走过的区域都有上一个机器人走过的地方,这样这些区域明显是联通的,所以可以认为是同一个机器人走过的地方。所以就这样一层一层的找,每找一层就相当于多了一个机器人。
复杂度为将图完全bfs一遍的复杂度o(mn)
下附代码
#2532519提交状态
状态: Accepted#include <bits/stdc++.h> #define max(a,b) ((a)>(b))?(a):(b) #define min(a,b) ((a)>(b))?(b):(a) #define rep(i,initial_n,end_n) for(int (i)=(initial_n);(i)<(end_n);i++) #define repp(i,initial_n,end_n) for(int (i)=(initial_n);(i)<=(end_n);(i)++) #define eps 1.0E-8 #define MAX_N 1010 using namespace std; typedef pair<int, int> pii; typedef pair<double, double> pdd; typedef long long ll; typedef unsigned long long ull; vector<pii> v[2]; void bfs(int sx, int sy, int now); int atlas[4010][4010], n, m, d[4][2] = { 0, 1, 1, 0, 0, -1, -1, 0 }; queue<pii> q; int main() { int nn; scanf("%d", &nn); getchar(); while(nn--) { memset(atlas, -1, sizeof(atlas)); scanf("%d%d", &n, &m); getchar(); char tmp; rep(i, 0, n) { rep(j, 0, m) { tmp = getchar(); if(tmp == 'A') atlas[i][j] = 0; else if(tmp == 'B') atlas[i][j] = 1; } getchar(); } int now = atlas[0][0]; v[now].push_back(make_pair(0, 0)); int ans = 0; while(!v[now].empty()) { int len = v[now].size(); rep(i, 0, len) bfs(v[now][i].first, v[now][i].second, now); ans++; v[now].clear(); now = 1 - now; } printf("%d\n", ans); } return 0; } void bfs(int sx, int sy, int now) { while(!q.empty()) q.pop(); q.push(make_pair(sx, sy)); atlas[sx][sy] = -1; pii tmp, tmpp; while(!q.empty()) { tmp = q.front(); q.pop(); rep(i, 0, 4) { tmpp.first = tmp.first + d[i][0], tmpp.second = tmp.second + d[i][1]; if(tmpp.first >= 0 && tmpp.first < n && tmpp.second >= 0 && tmpp.second < m) { if(atlas[tmpp.first][tmpp.second] == now) q.push(tmpp), atlas[tmpp.first][tmpp.second] = -1; else if(atlas[tmpp.first][tmpp.second] == 1 - now) v[1-now].push_back(tmpp); } } } }
相关文章推荐
- poj3921.Destroying the bus stations( 迭代加深搜索 && BFS )
- UVA 1600 - Patrol Robot( BFS & DFS)
- 博弈搜索练习-BFS&DFS
- BFS 搜索 Problem 1015 Knight Moves "马走日"之最少步数
- 搜索专题(BFS&&DFS)HDU1175-连连看
- [PKU 1077] 搜索之BFS & A*(下)
- 浙江大学2015年校赛F题 ZOJ 3865 Superbot BFS 搜索
- HDU 1043 && POJ 1077 Eight bfs || 双向bfs || A*搜索
- 搜索总结 - DFS&BFS&DBFS框架
- poj 1915&&poj 2243 Knight Moves (bfs搜索)
- [PKU 1915 2243] 搜索之BFS & A*(续)
- [PKU 1077] 搜索之BFS & A*(上)
- 搜索专题(DFS&&BFS&&剪枝)HDU 1728-逃离迷宫
- HDU 1312 Red and Black(经典搜索,DFS&BFS三种方式)
- 从国外某著名DNN 知情人士 Nina's Blog上看到一些有用的文章,在此记录一下,也为国内DNN,问题搜索,出一点力
- hdu 1242 Rescue(优先队列 && 广搜BFS)
- SDUT--找朋友(BFS&&DFS)
- HDU 5024 Wang Xifeng's Little Plot (bfs)
- POJ 2251 Dungeon Master :NYOJ 353 3D dungeon (三维空间上的搜索 bfs )
- POJ 3278 Catch that cow 广度优先搜索bfs