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

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

问某人从一个点走向另一个点的最短时间,并且走过的路程是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. JavaScript——变量与基本数据类型

    前言 JavaScript中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串. ...

  2. 设置pdsh的默认登录模式

    1.check your pdsh default rcmd rsh pdsh -q -w localhostSee what your pdsh default rcmd is. 2.Modify ...

  3. 腾讯云服务器linux centOS7.4 搭建ftp服务器 vsftpd

    腾讯云服务器linux centos 7.4 搭建ftp服务器 vsftpd 在centos 7.3测试也是OK的,其它版本没有实验 # 安装 vsftpd $ yum install vsftpd ...

  4. VS2017 C++操作mysql数据库

    1.首先安装mysql 具体教程可以参考https://blog.csdn.net/zhouzezhou/article/details/52446608 注意安装产品的时候记得选择MySQL Con ...

  5. Linear Regression and Maximum Likelihood Estimation

    Imagination is an outcome of what you learned. If you can imagine the world, that means you have lea ...

  6. g2蚂蚁数据可视化折线图,点位坐标label 图形文本设置

    应用g2可视化插件画了个粉丝分析图 要求显示如图所见的节点参数,查看文档蚂蚁图形文本设置,得知需要引入如下代码: chart.point().position('update*praises').la ...

  7. Python常用模块之PIL(手册篇:Image模块)

    官方手册地址:http://effbot.org/imagingbook/image.htm  Image模块 图像模块提供了一个具有相同名称的类,用于表示一个PIL的图像.该模块还提供了许多功能,包 ...

  8. 小米6x抓包小程序https请求

    1. charles安装证书,手机设置代理等这里不多讲了, 请进入下面链接查看详细 https://blog.csdn.net/manypeng/article/details/79475870 2. ...

  9. 20172325 2017-2018-2 《Java程序设计》第五周学习总结

    20172325 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.布尔表达式的值只有真或假,表达式的结果决定了下一步将要执行的语句. 2.循环语句可以用在 ...

  10. servlet 路径问题

    首先明确绝对路径与相对路径,绝对路径:相对于盘符的路径c://a.txt,相对路径格式如/web/hello.jsp.还有一个是网络路径http://www.baidu.com/...... 一般来说 ...