这题。。。。有点奇葩,但是不难。

在矩形方阵里,某人可以往前走或者左拐右拐。都需要消耗一个单位时间。

问某人从一个点走向另一个点的最短时间,并且走过的路程是5的倍数。

由于n,m都小,直接f[n][m][direction][color],表示所有状态,bfs更新即可。

召唤代码君:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int f[30][30][4][5];//position,direction,color
char s[30][30];
int n,m; bool inside(int cx,int cy)
{
return cx>0 && cx<=n && cy>0 && cy<=m;
} void _init()
{
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
for (int x=0; x<4; x++)
for (int y=0; y<5; y++)
f[i][j][x][y]=99999999;
} int _process()
{
queue<int> qx,qy,qd,qc;
for (int i=1; i<=n; i++)
{
scanf("%s",s[i]+1);
for (int j=1; s[i][j]; j++)
if (s[i][j]=='S')
{
f[i][j][0][0]=0;
qx.push(i),qy.push(j),qd.push(0),qc.push(0);
}
}
while (!qx.empty())
{
int cx=qx.front(),cy=qy.front(),cd=qd.front(),cc=qc.front();
qx.pop(),qy.pop(),qd.pop(),qc.pop();
int tmp=(cd+3)%4;
if (f[cx][cy][cd][cc]+1<f[cx][cy][tmp][cc])
{
f[cx][cy][tmp][cc]=f[cx][cy][cd][cc]+1;
qx.push(cx),qy.push(cy),qd.push(tmp),qc.push(cc);
/*
cout<<" inside : "<<cx<<' '<<cy<<' '<<tmp<<' ';
cout<<cc<<' '<<f[cx][cy][tmp][cc]<<endl;
*/
}
tmp=(cd+1)%4;
if (f[cx][cy][cd][cc]+1<f[cx][cy][tmp][cc])
{
f[cx][cy][tmp][cc]=f[cx][cy][cd][cc]+1;
qx.push(cx),qy.push(cy),qd.push(tmp),qc.push(cc);
/*
cout<<" inside : "<<cx<<' '<<cy<<' '<<tmp;
cout<<' '<<cc<<' '<<f[cx][cy][tmp][cc]<<endl;
*/
}
if (!inside(cx+dx[cd],cy+dy[cd]) || s[cx+dx[cd]][cy+dy[cd]]=='#') continue;
if (f[cx][cy][cd][cc]+1<f[cx+dx[cd]][cy+dy[cd]][cd][(cc+1)%5])
{
f[cx+dx[cd]][cy+dy[cd]][cd][(cc+1)%5]=f[cx][cy][cd][cc]+1;
if (s[cx+dx[cd]][cy+dy[cd]]=='T' && (cc+1)%5==0) return f[cx+dx[cd]][cy+dy[cd]][cd][0];
qx.push(cx+dx[cd]),qy.push(cy+dy[cd]),qd.push(cd),qc.push((cc+1)%5);
/*
cout<<" inside : "<<cx+dx[cd]<<' '<<cy+dy[cd]<<' '<<cd;
cout<<' '<<(cc+1)%5<<' '<<f[cx+dx[cd]][cy+dy[cd]][cd][(cc+1)%5]<<endl;
*/
}
}
return -1;
} int main()
{
//freopen("data.in","rb",stdin);
int cas=0;
while (scanf("%d%d",&n,&m) && (n|m))
{
_init();
int ans=_process();
if (cas) printf("\n");
printf("Case #%d\n",++cas);
if (ans==-1) puts("destination not reachable");
else printf("minimum time = %d sec\n",ans);
}
return 0;
}

  

UVA10047_The Monocycle的更多相关文章

  1. The Monocycle(BFS)

    The Monocycle Time Limit: 3000MS64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Des ...

  2. 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 ...

  3. UVa10047 The Monocycle

    UVa10047 The Monocycle 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19491 (以上摘自htt ...

  4. UVa (BFS) The Monocycle

    题目不光要求要到达终点而且要求所走的步数为5的倍数,每个时刻有三个选择,前进,左转弯,右转弯. 所以在vis数组中新增加两个维度即可,vis[x][y][dir][color]表示在(x, y)格子方 ...

  5. uva 10047 The Monocycle(搜索)

    好复杂的样子..其实就是纸老虎,多了方向.颜色两个状态罢了,依旧是bfs. 更新的时候注意处理好就行了,vis[][][][]要勇敢地开. 不过这个代码交了十几遍的submission error,手 ...

  6. UVA 10047 The Monocycle

    大白图论第二题··· 题意:独轮车的轮子被均分成五块,每块一个颜色,每走过一个格子恰好转过一个颜色. 在一个迷宫中,只能向前走或者左转90度或右转90度(我曾天真的认为是向左走和向右走···),每个操 ...

  7. Problem A: The Monocycle

    uva10047:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...

  8. UVA 10047-The Monocycle(队列bfs+保存4种状态)

    题意:给你一张地图,S代表起点,T代表终点,有一个轮盘,轮盘平均分成5份,每往前走一格恰好转1/5,轮盘只能往前进,但可以向左右转90°,每走一步或是向左向右转90° 要花费1单位的时间,问最少的时间 ...

  9. UVALive 2035 The Monocycle(BFS状态处理+优先队列)

    这道题目真是非常坎坷啊,WA了很多次,但所有的思路都是奔着广搜去想的,一开始出现了比答案大的数据,才想到了应该是优先队列,再说加上也肯定不会错.一开始我读错了题意,以为旋转并且前行需要的时间跟其他一样 ...

随机推荐

  1. restful_framework之视图组件

    一.基本视图 写一个出版社的增删查改resful接口 要自己事先创建好django项目,并创建好表,添加完记录 路由: url(r'^publish/$', views.PublishView.as_ ...

  2. Distributed2:SQL Server 创建分布式数据库

    分布式数据库的优势是将IO分散在不同的Physical Disk上,每次查询都由多台Server的CPU,I/O共同负载,通过各节点并行处理数据来提高性能,劣势是消耗大量的网络带宽资源,管理难度大.在 ...

  3. Windows:打开MSDTC,恢复Windows任务栏,查看windows日志,打开远程桌面,打开Services,资源监控

    Windows 服务器系列: Windows:查看IP地址,IP地址对应的机器名,占用的端口,以及占用该端口的应用程 Windows:使用Dos命令管理服务(Services) Windows:任务调 ...

  4. DIV样式汇总

    DIV样式汇总 最近在学习JavaScript,在做到个要控制控件样式的例子时,突然有了把常用样式汇总一下的想法,于是乎就写了以下内容,以下是以div为例来汇总的,希望对大家有些帮助. 一.常用属性: ...

  5. postMan测试Controller接口

    1.介绍 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 2.安装 Postman 4.1.2 下载地址: http://files.cnblogs.com/file ...

  6. JMeter下Groovy和BeanShell语言在不同组件中性能差异实践探究

    一般而言JMeter下性能最好的是jar包这类java原生请求,对于JMeter并没有原生支持的请求,一般都会将其直接编译为jar包,然后再JMeter中调用,这样性能最好. 但是有些需求并不适合用j ...

  7. 使用Chrome控制台进行3D模型编辑的尝试

    前言:3D模型编辑的核心是对顶点位置和纹理颜色的编辑,这个研究的目的在于寻找一种通过编程方式直接对模型进行编辑的方法,这种编辑方法和时下流行的通过鼠标点选.拖拽进行编辑的方法之间的关系,和前端编程中“ ...

  8. Unity3d — — UGUI之Box Collider自适应大小

    NGUI下给Sprite/image添加collider后能自适应大小,但是在UGUI下Collider是默认在(0,0)位置,size为0 因此写了个简单的脚本,效果如下(最后附代码) 1.如下图添 ...

  9. idea最常使用的快捷键

    撤销 反撤销 : Ctrl+Z / Ctrl+Shift+Z 删除一行 : Ctrl+Y 跳到实现类 : Ctrl+Alt+B 重命名文件:   shift+F6 控制台放大缩小: ctrl+shif ...

  10. 在Web Page中包含PHP代码

    PHP代码可以出现在Web Page的任何位置,甚至在HTML的标签里面也可以.有4中方式在Web Page中包含PHP代码: 使用<?php ... ?>标签 <!doctype ...