UVA10047独轮车
题意:
给你一个独轮车,轮子上有五个扇形,每过一个格子就转过一个扇形,刚开始的时候方向是向北的,绿色上行向下,每一次可以有三种操作,到下一个格子,左转90度,右转90度,每一次操作都花费时间1,问从起点到终点的最小步数,要求到终点的时候必须还是绿色扇形向下,方向无所谓。
思路:
mark[x][y][col][fx]代表的是在点(x,y)处,颜色是col方向是fx是否走过,然后就是个简单的广搜了,还有提示下,这个题目没有必要用优先队列的,每次操作花费都一样,仔细想想队列里面的东西,本来就是按照步数小的在前面存的,具体细节看代码,还有个事就是UVA上貌似没有pe啊!,pe貌似是直接wa的节奏。
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct
{
int x ,y ,fx ,col ,t;
}NODE;
NODE xin ,tou;
int mark[26][26][6][5];
int map[26][26];
int ex ,ey ,sx ,sy;
int n ,m;
bool ok(int x, int y ,int c ,int f)
{
return x >= 1 && x <= n && y >= 1 && y <= m && !map[x][y] && !mark[x][y][c][f];
}
int BFS()
{
xin.x = sx ,xin.y = sy ,xin.t = 0 ,xin.fx = 1 ,xin.col = 1;
memset(mark ,0 ,sizeof(mark));
mark[sx][sy][1][1] = 1;
queue<NODE>q;
q.push(xin);
while(!q.empty())
{
tou = q.front();
q.pop();
if(tou.x == ex && tou.y == ey && tou.col == 1)
return tou.t;
//向前
if(tou.fx == 1) xin.x = tou.x - 1 ,xin.y = tou.y;
if(tou.fx == 2) xin.x = tou.x ,xin.y = tou.y + 1;
if(tou.fx == 3) xin.x = tou.x + 1 ,xin.y = tou.y;
if(tou.fx == 4) xin.x = tou.x ,xin.y = tou.y - 1;
xin.fx = tou.fx ,xin.t = tou.t + 1 ,xin.col = (tou.col + 1) % 6;
if(!xin.col) xin.col ++;
if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
{
mark[xin.x][xin.y][xin.col][xin.fx] = 1;
q.push(xin);
}
//向右
xin.x = tou.x ,xin.y = tou.y;
xin.t = tou.t + 1 ,xin.col = tou.col;
xin.fx = tou.fx + 1;
if(xin.fx > 4) xin.fx = 1;
if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
{
mark[xin.x][xin.y][xin.col][xin.fx] = 1;
q.push(xin);
}
//向左
xin.x = tou.x ,xin.y = tou.y;
xin.t = tou.t + 1 ,xin.col = tou.col;
xin.fx = tou.fx - 1;
if(xin.fx == 0) xin.fx = 4;
if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
{
mark[xin.x][xin.y][xin.col][xin.fx] = 1;
q.push(xin);
}
}
return -1;
}
int main ()
{
int i ,j ,Ans ,cas = 1 ,mk = 0;
char str[30];
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
for(i = 1 ;i <= n ;i ++)
{
scanf("%s" ,str);
for(j = 0 ;j < m ;j ++)
{
if(str[j] == '#') map[i][j+1] = 1;
if(str[j] == '.') map[i][j+1] = 0;
if(str[j] == 'S') map[i][j+1] = 0 ,sx = i ,sy = j + 1;
if(str[j] == 'T') map[i][j+1] = 0 ,ex = i ,ey = j + 1;
}
}
Ans = BFS();
if(mk) puts("");
printf("Case #%d\n" ,cas ++);
Ans == -1 ? puts("destination not reachable"):printf("minimum time = %d sec\n" ,Ans);
mk = 1;
}
return 0;
}
UVA10047独轮车相关推荐
- 独轮车(广搜_队列)
时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 独轮车的轮子上有红.黄.蓝.白.绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走一个格子,轮子上的颜色变化一 ...
- 单点自平衡立方体相当于有几个自由度?自平衡自行车有几个自由度?独轮车有几个自由度?
单点自平衡立方体相当于有几个自由度?自平衡自行车有几个自由度?独轮车有几个自由度? .
- 爱尔威火星车 AirWheel 电动独轮车
爱尔威火星车 AirWheel 电动独轮车 http://www.airwheel.cn/intelligent.asp posted on 2013-07-19 22:39 lexus 阅读(... ...
- 《安富莱嵌入式周报》第306期:开源独轮车,Cortex-M85修订版r1发布,Terathon图形数学库,不断变革的IDE开发环境,各个厂家总动员
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- 独轮车(广搜状态转移的下一步伐的理解)
Problem D 独轮车 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 独轮车的轮子上有红.黄.蓝.白.绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走 ...
- 记录基于STM32的独轮车测试板构建(一)电机篇
今年是学校第一次参加智能车竞赛,毫无传承下想要脱颖而出那必定得先发制人,预选的是独轮车组,得用完全陌生的英飞凌单片机搞全新的独轮车模,难度不小.前些天看了看龙邱的库,在配套的母版上确实很简单好用,但独 ...
- UVa 10047,独轮车
题目链接:https://uva.onlinejudge.org/external/100/10047.pdf 题目链接:http://vjudge.net/contest/132239#proble ...
- UVA-10047 The Monocycle (图的BFS遍历)
题目大意:一张图,问从起点到终点的最短时间是多少.方向转动也消耗时间. 题目分析:图的广度优先遍历... 代码如下: # include<iostream> # include<cs ...
- UVa10047 BFS
题意:一自行车的轮子被分成5个扇区,涂了5种不同颜色.自行车每1秒要么骑到下一个格子,要么左转或者右转90..一开始自行车面向北,颜色为绿,到达目标格时,必须触底颜色为绿,但朝向无限制.求到达目标格的 ...
最新文章
- 机器学习的基础图表!
- ES6中的异步对象Promise
- Python3算法基础练习:编程100例(11 ~ 15)
- 如何关闭linux系统中的覆盖输出重定向()功能
- VC++多线程工作笔记0005---线程间通信
- zoj3802:easy 2048 again(状压dp)
- python 类可以调用实例变量_Python实例方法、类方法、静态方法区别详解
- Microsoft SQL Server是如何加密口令的?未公开的加密函数
- Docker个人理解与初级使用
- 使用kubeadm安装k8s
- 怎样一份简历,能够撬开大厂的大门?
- HTML鼠标放上去放大图片
- 页面布局的方式有哪些?
- 51单片机直流电机PID速度控制正反转控制(红外光电测速)LCD1602 L298N
- 磁盘检查清理修复命令
- 第十次作业 - 项目测评(团队)
- css vw单位_使用CSS vw单位创建完美的响应形状
- 设计题目:基于CPLD/FPGA的出租车计费器
- Driver和Master交互原理解析,Driver消息循环体的产生
- Android读取程序中文件