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 ...
随机推荐
- 转 SQL集合函数中利用case when then 技巧
SQL集合函数中利用case when then 技巧 我们都知道SQL中适用case when then来转化数据库中的信息 比如 select (case sex when 0 then '男' ...
- vmstat---有关进程、虚存、页面交换空间及 CPU信息
虚拟内存运行原理 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间.当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存 ...
- 关于Blocking IO,non-Blokcing IO,async IO的区别和理解
来源:http://shmilyaw-hotmail-com.iteye.com/blog/1896683 概括来说,一个IO操作可以分为两个部分:发出请求.结果完成.如果从发出请求到结果返回,一直B ...
- 前6名免费DNS服务 - 公共DNS服务
前6名免费DNS服务 - 公共DNS服务 谷歌 8.8.8.8,8.8.4.4备份,用户将期望并获得高可用性,如DNSSEC等过滤和安全保护. OpenDNS 现在是Cisco帝国的一部分,主要是20 ...
- vue-cli 和webpack
https://note.youdao.com/share/?id=d1851db9f0fe0a691798fac823849564&type=notebook#/C045BC3E7DC144 ...
- JS/CSS 在屏幕底部弹出消息
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- vue 刷新当前页面的方式
1.使用window.location.href window.location.replace() window.location.reload() 会出现空白,体验不是很好 2.先进入一个空路由, ...
- 前端项目中常用es6知识总结 -- Async、Await让异步美如画
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- 【AIM Tech Round 4 (Div. 2) C】Sorting by Subsequences
[链接]http://codeforces.com/contest/844/problem/C [题意] 水题,没有记录意义 [题解] 排序之后,记录每个数字原来在哪里就好. 可以形成环的. 环的个数 ...
- l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly
P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...