状态: Accepted
题目链接点这儿
开始一个空图,然后机器人在上面走,会留下A或者B,而且留下的标记会覆盖之前的标记。
题目会给一个有某些机器人走过的成品图(标记已经有了),问你最少几个机器人走可以形成这些标记。
明显联通的区域肯定是一个机器人走的,而与这个联通区域相连的另一个标记的地方都可以认为是一个机器人走的。因为我们可以认为最后一个机器人走过的区域都有上一个机器人走过的地方,这样这些区域明显是联通的,所以可以认为是同一个机器人走过的地方。所以就这样一层一层的找,每找一层就相当于多了一个机器人。
复杂度为将图完全bfs一遍的复杂度o(mn)
下附代码
状态: 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); } } } }