题意:
      给你一个独轮车,轮子上有五个扇形,每过一个格子就转过一个扇形,刚开始的时候方向是向北的,绿色上行向下,每一次可以有三种操作,到下一个格子,左转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独轮车相关推荐

  1. 独轮车(广搜_队列)

    时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 独轮车的轮子上有红.黄.蓝.白.绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走一个格子,轮子上的颜色变化一 ...

  2. 单点自平衡立方体相当于有几个自由度?自平衡自行车有几个自由度?独轮车有几个自由度?

    单点自平衡立方体相当于有几个自由度?自平衡自行车有几个自由度?独轮车有几个自由度? .

  3. 爱尔威火星车 AirWheel 电动独轮车

    爱尔威火星车 AirWheel 电动独轮车 http://www.airwheel.cn/intelligent.asp posted on 2013-07-19 22:39 lexus 阅读(... ...

  4. 《安富莱嵌入式周报》第306期:开源独轮车,Cortex-M85修订版r1发布,Terathon图形数学库,不断变革的IDE开发环境,各个厂家总动员

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  5. 独轮车(广搜状态转移的下一步伐的理解)

    Problem D 独轮车 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 独轮车的轮子上有红.黄.蓝.白.绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走 ...

  6. 记录基于STM32的独轮车测试板构建(一)电机篇

    今年是学校第一次参加智能车竞赛,毫无传承下想要脱颖而出那必定得先发制人,预选的是独轮车组,得用完全陌生的英飞凌单片机搞全新的独轮车模,难度不小.前些天看了看龙邱的库,在配套的母版上确实很简单好用,但独 ...

  7. UVa 10047,独轮车

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

  8. UVA-10047 The Monocycle (图的BFS遍历)

    题目大意:一张图,问从起点到终点的最短时间是多少.方向转动也消耗时间. 题目分析:图的广度优先遍历... 代码如下: # include<iostream> # include<cs ...

  9. UVa10047 BFS

    题意:一自行车的轮子被分成5个扇区,涂了5种不同颜色.自行车每1秒要么骑到下一个格子,要么左转或者右转90..一开始自行车面向北,颜色为绿,到达目标格时,必须触底颜色为绿,但朝向无限制.求到达目标格的 ...

最新文章

  1. 机器学习的基础图表!
  2. ES6中的异步对象Promise
  3. Python3算法基础练习:编程100例(11 ~ 15)
  4. 如何关闭linux系统中的覆盖输出重定向()功能
  5. VC++多线程工作笔记0005---线程间通信
  6. zoj3802:easy 2048 again(状压dp)
  7. python 类可以调用实例变量_Python实例方法、类方法、静态方法区别详解
  8. Microsoft SQL Server是如何加密口令的?未公开的加密函数
  9. Docker个人理解与初级使用
  10. 使用kubeadm安装k8s
  11. 怎样一份简历,能够撬开大厂的大门?
  12. HTML鼠标放上去放大图片
  13. 页面布局的方式有哪些?
  14. 51单片机直流电机PID速度控制正反转控制(红外光电测速)LCD1602 L298N
  15. 磁盘检查清理修复命令
  16. 第十次作业 - 项目测评(团队)
  17. css vw单位_使用CSS vw单位创建完美的响应形状
  18. 设计题目:基于CPLD/FPGA的出租车计费器
  19. Driver和Master交互原理解析,Driver消息循环体的产生
  20. Android读取程序中文件

热门文章

  1. linux--cut命令
  2. 丢失或损坏NDF文件如何附加数据库
  3. 编写优秀Bug报告的艺术 ----转载自CSDN(imlogic的专栏)
  4. [2010国家集训队]Crash的旅游计划
  5. Java NIO系列教程(五)Buffer
  6. JS选中OPTION
  7. 【SICP练习】107 练习3.8
  8. 谁把20岁上下的你给洗脑了
  9. 二维数组的传参数的方法
  10. Silverlight