【BFS】uva10047The Monocycle
来源:互联网 发布:javascript的回调 编辑:程序博客网 时间:2024/05/17 21:06
/*本题的特殊之处,到达一个格子时,因为朝向不同,以及接触地面的颜色不同,会处于不同的状态;;;;;;;;;把(x, y, d, c)作为一个结点,表示所在位置(x, y),方向为d,颜色为c;;;;;------------------------------------------------------------------------在方向上我们把前,左,右编号为0,1,2;;;;颜色,从蓝色开始编号为0,1,2,3;;;;;;;;;;--------------------------------------------------------------------------vis[x1][y1][0][0] = 1;起点S进入队列node a, b;a.x = x1;a.y = y1;a.d = 0;a.c = 0;a.t = 0;q.push(a);-----------------------------------------------------------------------b.t = a.t + 1;前进方向;;;时间加1b.c = (a.c + 1)%5;扩展后的颜色b.x = a.x + d[a.d][0];扩展后的位置b.y = a.y + d[a.d][1];b.d = a.d;方向不变if(judge(b)){ if(b.x == x2 && b.y == y2 && b.c == 0)是否到达终点 return b.t; vis[b.x][b.y][b.d][b.c] = 1; q.push(b);}----------------------------------------------------------------------------------b = a;向右转b.t ++;b.d = (b.d + 1)%4;扩展后的方向if(judge(b)){ vis[b.x][b.y][b.d][b.c] = 1; q.push(b);}b = a;向左转b.t ++;b.d = (b.d - 1 + 4)%4;if(judge(b)){ vis[b.x][b.y][b.d][b.c] = 1; q.push(b);}-------------------------------------------------------------------for(int i=0; i<m; i++)寻找始末点S和T点{ for(int j=0; j<n; j++) { if(g[i][j] == 'S') { x1 = i; y1 = j; break; } }}for(int i=0; i<m; i++){ for(int j=0; j<n; j++) { if(g[i][j] == 'T') { x2 = i; y2 = j; break; } }}------------------------------------------------------------------------------*/#include <iostream>#include <cstdio>#include <queue>#include <cstring>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;const int MAXN = 30;struct node{ int x, y, d, c, t;};int m, n;char g[MAXN][MAXN];int vis[MAXN][MAXN][6][6];int x1, x2, y1, y2;int d[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};int judge(node b){ if(b.x < 0 || b.x >= m || b.y < 0 || b.y >= n) return false; if(g[b.x][b.y] == '#') return false; if(vis[b.x][b.y][b.d][b.c]) return false; return true;}int bfs(){ queue<node> q; vis[x1][y1][0][0] = 1; node a, b; a.x = x1; a.y = y1; a.d = 0; a.c = 0; a.t = 0; q.push(a); while(!q.empty()) { a = q.front(); q.pop(); b.t = a.t + 1; b.c = (a.c + 1)%5; b.x = a.x + d[a.d][0]; b.y = a.y + d[a.d][1]; b.d = a.d; if(judge(b)) { if(b.x == x2 && b.y == y2 && b.c == 0) return b.t; vis[b.x][b.y][b.d][b.c] = 1; q.push(b); } b = a; b.t ++; b.d = (b.d + 1)%4; if(judge(b)) { vis[b.x][b.y][b.d][b.c] = 1; q.push(b); } b = a; b.t ++; b.d = (b.d - 1 + 4)%4; if(judge(b)) { vis[b.x][b.y][b.d][b.c] = 1; q.push(b); } } return -1;}int main(){ //freopen("input.txt","r",stdin); int kase = 1; while(scanf("%d%d",&m,&n) != EOF && (n+m)) { if(kase != 1) printf("\n"); printf("Case #%d\n",kase++); getchar(); for(int i=0; i<m; i++) gets(g[i]); for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(g[i][j] == 'S') { x1 = i; y1 = j; break; } } } for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(g[i][j] == 'T') { x2 = i; y2 = j; break; } } } memset(vis, 0, sizeof(vis)); int time = bfs(); if(time == -1) printf("destination not reachable\n"); else printf("minimum time = %d sec\n",time); } return 0;}
----------------------------
wuwuwuwuwuwuwuwu...................................
0 0
- 【BFS】uva10047The Monocycle
- UVA10047The Monocycle
- 10047 - The Monocycle//bfs
- UVA10047- The Monocycle(BFS)
- UVa10047 The Monocycle (BFS)
- UVA10047 The Monocycle (bfs)
- UVA 10047 - The Monocycle BFS
- UVA 10047 The Monocycle (BFS)
- 【UVa】10047 The Monocycle BFS
- UVA 10047 The Monocycle (bfs)
- uva 10047 The Monocycle BFS
- UVA-10047The Monocycle- bfs
- UVA 10047 The Monocycle(BFS)
- UVA 10047 The Monocycle(bfs)
- UVa10047-The Monocycle(bfs)
- UVa 10047 - The Monocycle, 优先队列+BFS
- uva 10047 - The Monocycle(Bfs)
- 10047 - The Monocycle(bfs,4级)
- 百度员工离职总结:如何做个好员工?(严重推荐)
- 一个关于IAP整理(部份)
- [LeetCode]Merge K sorted List合并K个有序链表
- 实现中等难度通讯录。需求: 1、定义联系人类AddressContact。实例变量:姓名(拼音,首字母大写)、性别、电话号码、住址、分组名称、年龄。方法:自定义初始化方法(姓名、电话号码)、显示联系人
- UVa11709 - Trust groups(Kosaraju,十字链表)
- 【BFS】uva10047The Monocycle
- python使用pygal进行绘制数据图表和监控图表
- HDU - 2222 Keywords Search (AC自动机)
- 三、进攻的敌人
- 对反射的理解
- 北京将严打电商售假:严重违法者将注销网站
- c++常用xml解析方式
- poj 2653 Pick-up sticks 计算几何
- 如何推广自己的网站,做好自己的排名?