UVA 10047 - The Monocycle BFS
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:3
int color;//开始为0,终点也要为0
bool 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");
else
printf("minimum time = %d sec\n",ans);
}
return 0;
}
UVA 10047 - The Monocycle BFS的更多相关文章
- UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...
- 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 10047,独轮车
题目链接:https://uva.onlinejudge.org/external/100/10047.pdf 题目链接:http://vjudge.net/contest/132239#proble ...
- The Monocycle(BFS)
The Monocycle Time Limit: 3000MS64bit IO Format: %lld & %llu [Submit] [Go Back] [Status] Des ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVA 439 Knight Moves(BFS)
Knight Moves option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=3 ...
随机推荐
- Android 学习笔记之Bitmap位图的旋转
位图的旋转也可以借助Matrix或者Canvas来实现. 通过postRotate方法设置旋转角度,然后用createBitmap方法创建一个经过旋转处理的Bitmap对象,最后用drawBitmap ...
- Ubuntu 12.04使用演示
今年年初,发布了Ubuntu 12.04(代号Precise Pangolin),但正式版预计将于2012年的4月底发布,作者对最新版本的ubuntu做了试用,先将操作视频与大家分享.更多内容请关注本 ...
- vs2010 Visula C++ 把CString 转换为string 类型
CString strSomeCstring ("This is a CString Object"); // Use ANSI variant CStringA to conve ...
- cocos2dx-js学习笔记(一)环境搭建
本人眼下的学习方向是cocos2dx+js的开发方式,开发调试使用webstrom和火狐浏览器,调试完毕的项目使用cocos2dx+jsb的方式编译到PC或android设备执行.主要时间用在学习,所 ...
- ubuntu-文件管理、编辑
1.创建单层文件夹 mkdir test 如果你想要创建多层文件夹,这时候你需要添加一个参数-p mkdir -p t1/t2/t3 如果你不加-p的话,它会提示说找不到目录 2.分屏查看内容 mor ...
- Mysql基本增删改查
1登陆服务器 mysql -h localhost -u username -p password 2查看存在数据库 show databases; 3创建一个数据库(例如名字为class1,以下都是 ...
- Java学习笔记二.1
和其他高级语言类似,Java也具有以下部分 1.关键字:见下表,注意Java严格区分大小写,关键字都是小写 2.标识符:见下图 3.注释.有两种://(单行注释)和/**/(多行注释).还有一种文档注 ...
- JavaFx EventHandler
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHan ...
- Javascript 继承和克隆
个人总结: call 继承的是父类私有 prototype 继承的父类公有 create 可以将公有或私有继承到子类上去(克隆) for in 克隆 不管公有还是私有的都克隆成私有的 1.原型继承:将 ...
- CSS3制作W3cplus的关注面板
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...