UVA 10047-The Monocycle(队列bfs+保存4种状态)
题意:给你一张地图,S代表起点,T代表终点,有一个轮盘,轮盘平均分成5份,每往前走一格恰好转1/5,轮盘只能往前进,但可以向左右转90°,每走一步或是向左向右转90°
要花费1单位的时间,问最少的时间到达终点,如果无法到达,输出 destination not reachable,起点状态是朝北,着地颜色是绿色,到达终点的条件是着地颜色是绿色,方向任意。
解析:bfs搜一遍,但要保存4种状态,分别是坐标x,y,方向和颜色。每次选择有3种,1、向前进,2、左转,3、右转。
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
const int maxn=26;
int row,col,bex,bey,ans; //bex,bey是起点坐标
string maze[maxn]; //0:north,1:west,2:south,3:east
bool vis[maxn][maxn][4][5]; //green:0,black:1,red:2,blue:3,white:4
bool in(int x,int y){ return x>=0&&x<row&&y>=0&&y<col; } //是否在地图内
struct node // 保存4种状态以及花费
{
int x,y,dir,color;
int dist;
node(int x=0,int y=0,int dir=0,int color=0,int dist=0)
:x(x),y(y),dir(dir),color(color),dist(dist){}
};
queue<node> que;
void init()
{ while(!que.empty()) que.pop();
memset(vis,0,sizeof(vis));
}
void addnode(int x,int y,int dir,int color,int dist) // 增加节点
{ if(in(x,y)&&maze[x][y]!='#'&&!vis[x][y][dir][color]) // 在地图内,不是墙,且该种状态未被访问过
{
vis[x][y][dir][color]=true;
que.push(node(x,y,dir,color,dist));
}
}
void same_dir(int x,int y,int dir,int color,int dist) // 向前进
{
if(dir==0) addnode(x-1,y,dir,(color+1)%5,dist+1); //颜色要变化
else if(dir==1) addnode(x,y-1,dir,(color+1)%5,dist+1);
else if(dir==2) addnode(x+1,y,dir,(color+1)%5,dist+1);
else addnode(x,y+1,dir,(color+1)%5,dist+1);
}
void dir_change(int x,int y,int dir,int color,int dist)
{
for(int i=0;i<4;i++) //改变方向
{
if(i==dir||abs(i-dir)==2) continue;
addnode(x,y,i,color,dist+1);
}
}
bool solve()
{
init();
que.push(node(bex,bey,0,0,0)); //加入起点
vis[bex][bey][0][0]=true;
while(!que.empty())
{
node now=que.front(); que.pop();
if(maze[now.x][now.y]=='T'&&now.color==0){ ans=now.dist; return true; } //找到答案
int x=now.x, y=now.y, dir=now.dir, color=now.color, dist=now.dist;
same_dir(x,y,dir,color,dist);
dir_change(x,y,dir,color,dist);
}
return false;
}
int main()
{
int Case=0;
while(scanf("%d%d",&row,&col)!=EOF)
{ if(!row&&!col) break;
if(Case++) printf("\n");
for(int i=0;i<row;i++)
{
cin>>maze[i];
for(int j=0;j<col;j++)
if(maze[i][j]=='S') bex=i,bey=j;
}
printf("Case #%d\n",Case);
if(!solve()) printf("destination not reachable\n");
else printf("minimum time = %d sec\n",ans);
}
return 0;
}
UVA 10047-The Monocycle(队列bfs+保存4种状态)的更多相关文章
- UVA 10047 - The Monocycle BFS
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 10047 The Monocycle
大白图论第二题··· 题意:独轮车的轮子被均分成五块,每块一个颜色,每走过一个格子恰好转过一个颜色. 在一个迷宫中,只能向前走或者左转90度或右转90度(我曾天真的认为是向左走和向右走···),每个操 ...
- UVA 10047 The Monocycle (状态记录广搜)
Problem A: The Monocycle A monocycle is a cycle that runs on one wheel and the one we will be consi ...
- uva 10047 The Monocycle(搜索)
好复杂的样子..其实就是纸老虎,多了方向.颜色两个状态罢了,依旧是bfs. 更新的时候注意处理好就行了,vis[][][][]要勇敢地开. 不过这个代码交了十几遍的submission error,手 ...
- uva 10047 the monocyle (四维bfs)
算法指南白书 维护一个四维数组,走一步更新一步 #include<cstdio> #include<cstring> #include<queue> #includ ...
- UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)
思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...
- CH 2601 - 电路维修 - [双端队列BFS]
题目链接:传送门 描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致 ...
随机推荐
- Tomcat部署项目通过—IP地址:端口访问
如题所示,实现效果图如下: 设置如下: (1)修改${tomcat}/config/sever.xml文件虚拟内容目录: <Engine name="Catalina" de ...
- Poj2946-The Warehouse(bfs+哈希)
题目我就不粘贴了... 题意:给出地图,最大8*8,出口用'E'表示,空地用'.'表示,数字表示此处有多少个箱子,主人公的起点应该是在有箱子的地方,他可以朝四个方向移动,但是只有两种方式 一种是他移动 ...
- 【LeetCode练习题】Remove Duplicates from Sorted List II
Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...
- js网页返回页面顶部的小方法
咳咳,在网页出现滚动条的时候,许多网站会在右下角出现一个图标,点击可以回到页面顶部 本文就记录下js实现代码: 1.在html页面body添加dom元素 <img src="toTop ...
- Staple: Complementary Learners For Real-time Tracking Tracking
转载注明出处: http://www.cnblogs.com/sysuzyq/p/6169414.html By 少侠阿朱 讨论班上的PPT 1.同学大家好.今天给大家讲一篇单目标跟踪的论文,方法比较 ...
- java与.net比较学习系列(3) 基本数据类型和类型转换
在Java中,数据类型分为两类,一类是基本数据类型,另外一类是引用类型. 而在C#中,数据类型分为三类,分别是基元类型,值类型和引用类型.其中基元类型是.net framework框架中预定义的类型, ...
- Guava源码分析——ServiceManager
ServiceManager类: 用于监控服务集的管理器,该类提供了诸如startAsync.stopAsync.servicesByState方法来运行.结束和检查服务集,而且,通过监听器 ...
- C#软件开发实例.私人订制自己的屏幕截图工具(七)加入放大镜的功能
上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(六)加入配置管理功能 因为截图时可能须要精确截取某一部分,所以须要放大镜的功能,这样截取的时候才更easy定位截图的位置. 加入PictureBo ...
- 基于ADODBX对数据库的CURD
学asp.net也有一个多星期了,之前对这个一无所知,也不知道怎么去找一些相关的资料去学习,不懂了就问问别人这个怎么做,那个怎么写,要不是有jsp和php的基础,估计还得弄上好长的时间来学习.记录一下 ...
- fullcalendar .net版本
实现了基本的增删改和拖拽,先记与此,抽时间继续优化和完善. 参考链接:http://www.helloweba.com/tag-fullcalendar.html 参考demo: http://f ...