http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=988

题目大意:

独轮车的车轮被分为5个扇形,分别涂上一种不同的颜色,现在有一个人行驶在M*N的玩个平面上。每个格子的大小刚好为一个扇形。有些格子有障碍,骑车的人从S出发要到达T,途中,在任何一个格子的时候他要么骑到下一个格子,要么左转或者右转90度,初始他面朝北,并且绿色格子贴着地面,要求到终点时候也是绿色格子贴着地面。

思路:

半年前觉得挺难的题目现在看起来好简单。哈哈哈哈哈哈哈哈哈~

BFS。。

状态需要记录方向和此时的颜色。

代码略丑。主要是BFS过程中我是直接枚举的。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=30;
char map[MAXN][MAXN];
bool vis[MAXN][MAXN][5][4];//x,y,color,dir
int m,n;
struct state
{int x,y;int step;int dir;//direction :north:0 south:1 east:2 west:3int color;//开始为0,终点也要为0bool operator <(const state &a)const {return step > a.step;}state(){;}state(int x,int y,int step,int dir,int color) :x(x) ,y(y),step(step), dir(dir), color(color){}
}start,fin;
int bfs()
{memset(vis,0,sizeof(vis));priority_queue<state> q;q.push(start);vis[start.x][start.y][start.color][start.dir]=true;while(!q.empty()){state cur=q.top();q.pop();if(cur.x==fin.x && cur.y==fin.y && cur.color==0)//找到答案了!return cur.step;int x=cur.x,y=cur.y,step=cur.step,color=cur.color,dir=cur.dir;switch(cur.dir){case 0:    //北if(!vis[x-1][y][(color+1) % 5][dir] && map[x-1][y]!='#'){vis[x-1][y][(color+1) % 5][dir]=1;q.push(state(x-1,y,step+1,dir,(color+1) % 5));}if(!vis[x][y][color][2]){ vis[x][y][color][2]=1; q.push(state(x,y,step+1,2,color));}if(!vis[x][y][color][3]) { vis[x][y][color][3]=1;    q.push(state(x,y,step+1,3,color));}    break;case 1:    //南if(!vis[x+1][y][(color+1) % 5][dir] && map[x+1][y]!='#'){vis[x+1][y][(color+1) % 5][dir]=1;q.push(state(x+1,y,step+1,dir,(color+1) % 5));}if(!vis[x][y][color][2]){ vis[x][y][color][2]=1; q.push(state(x,y,step+1,2,color));}if(!vis[x][y][color][3]) { vis[x][y][color][3]=1;  q.push(state(x,y,step+1,3,color));}    break;case 2:    //东if(!vis[x][y+1][(color+1) % 5][dir] && map[x][y+1]!='#'){vis[x][y+1][(color+1) % 5][dir] =1;q.push(state(x,y+1,step+1,dir,(color+1) % 5));}if(!vis[x][y][color][0]){ vis[x][y][color][0]=1; q.push(state(x,y,step+1,0,color));}if(!vis[x][y][color][1]){ vis[x][y][color][1]=1; q.push(state(x,y,step+1,1,color));  }break;case 3:     //西if(!vis[x][y-1][(color+1) % 5][dir] && map[x][y-1]!='#'){vis[x][y-1][(color+1) % 5][dir]=1;q.push(state(x,y-1,step+1,dir,(color+1) % 5));}if(!vis[x][y][color][0]){ vis[x][y][color][0]=1; q.push(state(x,y,step+1,0,color));}if(!vis[x][y][color][1]){vis[x][y][color][1]=1; q.push(state(x,y,step+1,1,color));  }break;}}return -1;
}
int main()
{int kase=1;while(~scanf("%d%d",&m,&n),m||n){for(int i=1;i<=m;i++)scanf("%s",map[i]+1);for(int i=0;i<=n+1;i++)            //最外面加上一层围墙,等下过程就可以减少判断。map[0][i]=map[m+1][i]='#';for(int i=0;i<=m+1;i++)map[i][0]=map[i][n+1]='#';/*for(int i=0;i<=m+1;i++){for(int j=0;j<=n+1;j++)printf("%c",map[i][j]);puts("");}*/for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(map[i][j]=='S'){state temp(i,j,0,0,0);start=temp;map[i][j]='.';}else if(map[i][j]=='T'){state temp(i,j,0,0,0);fin=temp;map[i][j]='.';}}}int ans=bfs();if(kase!=1)printf("\n");printf("Case #%d\n",kase++);if(ans==-1)printf("destination not reachable\n");elseprintf("minimum time = %d sec\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/murmured/p/5004111.html

UVA 10047 - The Monocycle BFS相关推荐

  1. 【Uva - 10047 】The Monocycle(搜索,bfs记录状态)

    题干: Uva的题目就不粘贴题干了,,直接上题意吧. 有你一个独轮车,车轮有5种颜色,为了5中颜色的相对位置是确定的.有两种操作:1.滚动:轮子必须沿着顺时针方向滚动,每滚动一次会到达另一个格子,着地 ...

  2. uva 10047 the monocyle (四维bfs)

    算法指南白书 维护一个四维数组,走一步更新一步 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 ...

  3. UVa 10047,独轮车

    题目链接:https://uva.onlinejudge.org/external/100/10047.pdf 题目链接:http://vjudge.net/contest/132239#proble ...

  4. uva 1533 - Moving Pegs(BFS)

    题目链接:uva 1533 - Moving Pegs 题目大意:在一个跳棋的棋盘上,有15个位置,如题目中图示,现在给出n,表示第n个位置上的没有棋子,问说最少跳几步可以使的棋盘上的棋子只剩一个,并 ...

  5. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  6. UVa 10603 Fill (BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻,某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和dd ...

  7. Abbott's Revenge UVA - 816 (输出bfs路径)

    题目链接:https://vjudge.net/problem/UVA-816 题目大意: 有一个最多包含9*9 个交叉点的迷宫.输入起点,离开起点时的朝向和终点,求一条最短路(多解时任意输出 一个即 ...

  8. 2010年湖南省第六届大学生程序设计大赛 F题 “Biggest Number” CSG - 1051 // UVA 11882 (dfs+bfs+剪枝)

    题目链接 一.题目内容 一个r行c列的矩阵,里面只有1-9的数字和'#',最开始可以随意挑选一个数字然后可以上下左右移动,问所走的路径所含数字最大为多少. 样例解释 input 3 7 ##9784# ...

  9. uva 816(经典bfs例子)

    题意:有一个最多包含9*9个交叉点的迷宫 .输入起点,离开起点时的朝向和终点,求一条最短路径.每个交叉点的朝向不同能左转,右转或直走也不同.求最短路径. 分析:定义三元数组,[x][y][dir],位 ...

最新文章

  1. openresty开发系列30--openresty中使用http模块
  2. python382怎么用_用python做UDP连接
  3. CF755G PolandBall and Many Other Balls(多项式/倍增fft)
  4. 将本地已经存在的代码跟github上新建的仓库建立关联,解决“fatal: 'origin' does not appear to be a git repository...”
  5. [导入]用户控件包装器
  6. Dijstra--讲解
  7. 报错:bash: pip: command not found
  8. C语言笔试题与答案解析
  9. ADSL防御黑客攻击的十大方法(转)
  10. Win32扫雷(根据以前的控制台扫雷实现)
  11. [MDK]MDK通杀版注册机(更新最新的注册机,支持5.15, 5.16, 5.17,5.18,5.20,5.21, 5.22,5.23,5.24)
  12. cmt obm odm 代工模式oem_ODM/OEM/OBM的区别
  13. putty连接设备时报错 Can’t agree a key change algorithm
  14. 巫宁坤 一滴泪 pdf mobi kindle
  15. 手机丢了不可怕,手机卡丢了才最可怕!
  16. 爬虫教程( 3 ) --- 手机 APP 数据抓取
  17. configure error /bin/bash /config sub failed
  18. Windows中cl命令编译运行C++
  19. 我与OutLook有个约会
  20. ExtJs6 store发送数据添加参数

热门文章

  1. Java笔记-RestTemplate(Java进程)配置代理Fiddler抓包
  2. 信息安全工程师笔记-网络设备安全
  3. Android笔记-对称与非对称加密及DH密钥交换
  4. Windows破解笔记-windows API中的SendMessage
  5. 编码风格工作笔记-初步模仿大佬编码风格
  6. Qt工作笔记-自定义开关控件
  7. 按英语体育计算机创建透视表,数据透视表和数据透视图概述
  8. java二嗨租车项目_JAVA第二季项目实战———答答租车系统代码
  9. char装cstring_VC中char*转换为CString
  10. python开发项目架构图_我的第一个python web开发框架(8)——项目结构与RESTful接口风格说明...