【UVALive 7364】Robots(逆向思维+搜索)
2016-10-10 21:33
309 查看
【UVALive 7364】Robots(逆向思维+搜索)
题目大意:
n个机器人在坐标0~n-1上。
有两个按钮,可以让每个位置上的机器人到该按钮指定的点去(∈[0,n−1])。
问是否可以经过几次操作,让所有机器人到一个点上。
考虑最终状态是所有机器人在一个点,考虑两两机器人相互关系,从状态(i,i)开始逆向搜索,搜到的状态(a,b)经过多次A或B操作能达到(i,i)。
那么遍历所有机器人对,如果两两可以到达同一个点,最终一定有方式全部到一个点。
所以就BFS一下就行了。。一开始用的DFS结果TLE了……
代码如下:
题目大意:
n个机器人在坐标0~n-1上。
有两个按钮,可以让每个位置上的机器人到该按钮指定的点去(∈[0,n−1])。
问是否可以经过几次操作,让所有机器人到一个点上。
考虑最终状态是所有机器人在一个点,考虑两两机器人相互关系,从状态(i,i)开始逆向搜索,搜到的状态(a,b)经过多次A或B操作能达到(i,i)。
那么遍历所有机器人对,如果两两可以到达同一个点,最终一定有方式全部到一个点。
所以就BFS一下就行了。。一开始用的DFS结果TLE了……
代码如下:
#include <iostream> #include <cmath> #include <vector> #include <cstdlib> #include <cstdio> #include <climits> #include <ctime> #include <cstring> #include <queue> #include <stack> #include <list> #include <algorithm> #include <map> #include <set> #define LL long long #define Pr pair<int,int> #define fread(ch) freopen(ch,"r",stdin) #define fwrite(ch) freopen(ch,"w",stdout) using namespace std; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; const double eps = 1e-8; const int maxn = 1123; vector <int> vc[2][maxn]; bool vis[maxn][maxn]; void bfs(int a,int b) { queue <Pr> q; q.push(Pr(a,b)); Pr p; vis[a][b] = vis[b][a] = 1; while(!q.empty()) { p = q.front(); q.pop(); a = p.first; b = p.second; for(int i = 0; i < 2; ++i) for(int j = 0; j < vc[i][a].size(); ++j) for(int k = 0; k < vc[i][b].size(); ++k) if(!vis[vc[i][a][j]][vc[i][b][k]]) { vis[vc[i][a][j]][vc[i][b][k]] = vis[vc[i][b][k]][vc[i][a][j]] = 1; q.push(Pr(vc[i][b][k],vc[i][a][j])); } } } bool solve(int n) { int x; for(int j = 0; j < 2; ++j) for(int i = 0; i < n; ++i) vc[j][i].clear(); for(int j = 0; j < 2; ++j) for(int i = 0; i < n; ++i) { scanf("%d",&x); vc[j][x].push_back(i); } memset(vis,0,sizeof(vis)); for(int i = 0; i < n; ++i) bfs(i,i); for(int i = 0; i < n; ++i) for(int j = 0; j < n; ++j) if(!vis[i][j]) return false; return true; } int main() { //fread(""); //fwrite(""); int t,k,n; scanf("%d",&t); while(t--) { scanf("%d%d",&k,&n); printf("%d %s\n",k,solve(n)? "YES": "NO"); } return 0; }
相关文章推荐
- UVALive-4793 Robots on Ice 搜索加剪枝
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- UVALive 6953 Digi Comp II(搜索)
- UVAlive 6156 Sentry Robots
- UVALive 6255 Kingdoms --状态搜索
- UVA 1063|11318|UVALive 3807|Marble Game|搜索
- UVALive - 3902 Network 无根树转为有跟树+搜索+贪心
- UVALive 6470 Chomp --记忆化搜索
- UVALive-7354-Kitchen Measurements(BFS搜索)
- UVALive 3907 (LA 3907) Puzzle AC自动机 + 搜索DP 记录路径
- UVALive3135 UVA1203 POJ2051 ZOJ2212 Argus【优先队列+优先搜索】
- UVALive 5907 —— Tichu(搜索)
- UVALive 6897 Exploration(逆向思维)
- UVALive - 7672 - What a Ridiculous Election(搜索预处理)
- UVALive 4527 Vaccination Centers 搜索+剪枝
- UVALive 3621 Power Calculus n次幂最少需要几次乘除得到 搜索
- [UvaLive 6757] Cup of Cowards [搜索]
- UVALive 5966 Blade and Sword -- 搜索(中等题)
- UVALive 6168 Fat Ninjas --二分小数+搜索
- uvalive 3635 - Pie(二分搜索)