Problem D

独轮车

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

独轮车的轮子上有红、黄、蓝、白、绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走一个格子,轮子上的颜色变化一次。独轮车只能向前推或在原地转向。每走一格或原地转向90度均消耗一个单位时间。现给定一个起点(S)和一个终点(T),求独轮车以轮子上的指定颜色到达终点所需的最短时间。

输入:

本题包含一个测例。测例中分别用一个大写字母表示方向和轮子的颜色,其对应关系为:E-东、S-南、W-西、N-北;R-红、Y-黄、B-蓝、W-白、G-绿。在测试数据的第一行有以空格分隔的两个整数和两个大写字母,分别表示起点的坐标S(x,y)、轮子的颜色和开始的方向,第二行有以空格分隔的两个整数和一个大写字母,表示终点的坐标T(x,y)和到达终点时轮子的颜色,从第三行开始的20行每行内包含20个字符,表示迷宫的状态。其中'X'表示建筑物,'.'表示路.

输出:

在单独的一行内输出一个整数,即满足题目要求的最短时间。

输入样例:

3 4 R N
15 17 Y
XXXXXXXXXXXXXXXXXXXX
X.X...XXXXXX......XX
X.X.X.....X..XXXX..X
X.XXXXXXX.XXXXXXXX.X
X.X.XX....X........X
X...XXXXX.X.XX.X.XXX
X.X.XX....X.X..X.X.X
X.X.X..XX...XXXX.XXX
X.X.XX.XX.X....X.X.X
X.X....XX.X.XX.X.X.X
X.X.X.XXXXX.XX.X.XXX
X.X.X.XXXXX....X...X
X.X.......X.XX...X.X
X.XXX.XXX.X.XXXXXXXX
X.....XX.......X...X
XXXXX....X.XXXXXXX.X
X..XXXXXXX.XXX.XXX.X
X.XX...........X...X
X..X.XXXX.XXXX...XXX
XXXXXXXXXXXXXXXXXXXX

输出样例:

56

来源:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 210
char mapp[MAXN][MAXN];
int visit[MAXN][MAXN][6][6];
int dirx[4]={-1,1,0,0}; //上,下,左,右
int diry[4]={0,0,-1,1};
struct Node
{int x,y,color,dir,step;
};
queue<Node> q;
Node s,e;
int check(struct Node X)
{if(X.x<=0||X.x>20||X.y<=0||X.y>20||mapp[X.x][X.y]=='X'||visit[X.x][X.y][X.color][X.dir]==1)return 0;return 1;
}
int bfs()
{Node a,b;a.x=s.x,a.y=s.y,a.color=s.color,a.dir=s.dir,a.step=0;q.push(a);while(!q.empty()){a=q.front();q.pop();if(a.x==e.x&&a.y==e.y&&a.color==e.color) return a.step;  //return 是在pop的时候就returnif(a.dir==0){b=a; b.color=(a.color+1)%5;b.x=a.x-1;b.y=a.y;b.dir=a.dir;                      //step可以是step+1,也可是step+2 ,统称为下一步伐,在一些情况下,step+2可能通过广搜if(check(b))                                        //难找最短,要么优先队列,要么将问题转为step+1的情况{visit[b.x][b.y][b.color][b.dir]=1;b.step=a.step+1;q.push(b);}}else if(a.dir==1){b=a; b.color=(a.color+1)%5;b.x=a.x;b.y=a.y-1;b.dir=a.dir;if(check(b)){visit[b.x][b.y][b.color][b.dir]=1;b.step=a.step+1;q.push(b);}}else if(a.dir==2){b=a; b.color=(a.color+1)%5;b.x=a.x+1; b.y=a.y; b.dir=a.dir;if(check(b)){visit[b.x][b.y][b.color][b.dir]=1;b.step=a.step+1;q.push(b);}}else if(a.dir==3){b=a; b.color=(a.color+1)%5;b.x=a.x; b.y=a.y+1; b.dir=a.dir;if(check(b)){visit[b.x][b.y][b.color][b.dir]=1;b.step=a.step+1;q.push(b);}}b=a;  b.dir=(a.dir+1)%4;   if(check(b)) {visit[b.x][b.y][b.color][b.dir]=1; b.step=a.step+1; q.push(b);}  //原地转动不变色b=a;  b.dir=(a.dir-1+4)%4; if(check(b)) {visit[b.x][b.y][b.color][b.dir]=1; b.step=a.step+1; q.push(b);}}return -1; //找不到输出-1;
}
int main()
{int i,j;char a,b,c;scanf("%d %d %c %c",&s.x,&s.y,&a,&b);scanf("%d %d %c",&e.x,&e.y,&c);switch(a){case 'R':s.color=0;break;case 'Y':s.color=1;break;case 'B':s.color=2;break;case 'W':s.color=3;break;case 'G':s.color=4;break;}switch(b){case 'N':s.dir=0;break;case 'W':s.dir=1;break;case 'S':s.dir=2;break;case 'E':s.dir=3;break;}switch(c){case 'R':e.color=0;break;case 'Y':e.color=1;break;case 'B':e.color=2;break;case 'W':e.color=3;break;case 'G':e.color=4;break;}for(i=1;i<=20;i++){getchar();for(j=1;j<=20;j++)scanf("%c",&mapp[i][j]);}memset(visit,0,sizeof(visit));visit[s.x][s.y][s.color][s.dir]=1;int ans=bfs();printf("%d\n",ans);return 0;
}

独轮车(广搜状态转移的下一步伐的理解)相关推荐

  1. 简单深搜广搜基本模板

    简单搜索 DFS: 剪枝,条件 容易超时,超时后基本就是剪枝的问题/无限递归?,或者用广搜试试? 模板(自己的理解) int n,m;//一般输入的行列数/边界 int mov[4][2] = {1, ...

  2. hdu5025 状态压缩广搜

    题意:       悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个1只拿一个就行),拿钥匙i之前必须拿到钥匙i-1,打蛇多花费一秒,问救出唐僧并且拿到所有种类 ...

  3. NYOJ999 师傅又被妖怪抓走了(预处理+状态压缩+广搜BFS)

    题目: 师傅又被妖怪抓走了 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥 ...

  4. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  5. 深搜DFS\广搜BFS 图初步入门

    首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题. 深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断 ...

  6. 试题 历届试题 九宫重排(双向广搜)

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  7. 多源BFS-双端队列广搜

    多源BFS AcWing173. 矩阵距离 给定一个N行M列的01矩阵A,A[i][j]A[i][j]A[i][j] 与 A[k][l]A[k][l]A[k][l] 之间的曼哈顿距离定义为: dist ...

  8. 深搜和广搜(初学者)

    搜索入门 最近对搜索有了一点浅显的了解,想跟大家分享分享. 说起来我也是初学者,恰巧有些自己的理解,想起来自己开始学习搜索的情况,真是一把鼻子一把泪啊.所以想把我领悟的过程,看到的一些基础的我觉得好的 ...

  9. 【搜索-广搜】 迷宫的最短路径

    题目: 给定一个大小为N*M的迷宫,由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是有 ...

最新文章

  1. 序列化:ProtoBuf与JSON的比较
  2. 常见的shell实例
  3. iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码...
  4. IntelliJ IDEA mac快捷键
  5. python(matplotlib1)——figure图像,坐标设置
  6. 百度seo指南_什么是SEO?网站怎么做SEO优化(问答篇)
  7. 正式突破两千粉丝!开心!
  8. 连破四次吉尼斯世界纪录!厨师界再出神人,用一公斤拉面缔造了一代传奇,背后却是简单的原理……
  9. 【Leetcode819】最常见的单词
  10. 图论 —— 网络流 —— 费用流 —— MCMF 算法
  11. 《少年的你》惊现魅族手机,“心酸”回应:纯属意外 小破厂没钱植入
  12. 【jvm】jvm 网络使用率 nicstat
  13. MySql安装错误代码1045的解决方案
  14. windows配置路由表办公网和外网自动切换
  15. 图像相似度的评价指标 : FID(Fréchet Inception Distance)
  16. 论文阅读Underexposed Photo Enhancement using Deep Illumination Estimation
  17. html什么布局可以兼容多平台,腾讯游戏:浅谈游戏官网现状及设计趋势
  18. php获取qq空间,使用php进行批量抓取QQ空间相册链接
  19. 论文中出现的 cf. i.e. s.t. e.g. w.r.t. et al. etc等英文缩写是什么意思
  20. C语言程序设计授课记录202003

热门文章

  1. 苹果的Facetime为何不开放?
  2. python的模拟登录原理_Python模拟登陆实例详解
  3. mysql数据库创建快递_Mysql索引
  4. 计算机病毒嵌入性,基于嵌入式的计算机病毒免疫系统平台设计研究
  5. Visa:的确向央行提交了银行卡清算机构申请 不过需要时间
  6. 电脑玩手游绝地求生:全军出击手游PC电脑版使用教程
  7. linux psycopg2,在unix上为python 3.5安装psycopg2包
  8. B站频繁暂停并弹出登录框
  9. Zeal离线开发文档
  10. 漫步者耳机看网页版视频自动关机