UVA10047_The Monocycle
这题。。。。有点奇葩,但是不难。
在矩形方阵里,某人可以往前走或者左拐右拐。都需要消耗一个单位时间。
问某人从一个点走向另一个点的最短时间,并且走过的路程是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的更多相关文章
- The Monocycle(BFS)
The Monocycle Time Limit: 3000MS64bit IO Format: %lld & %llu [Submit] [Go Back] [Status] Des ...
- 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 ...
- UVa10047 The Monocycle
UVa10047 The Monocycle 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19491 (以上摘自htt ...
- UVa (BFS) The Monocycle
题目不光要求要到达终点而且要求所走的步数为5的倍数,每个时刻有三个选择,前进,左转弯,右转弯. 所以在vis数组中新增加两个维度即可,vis[x][y][dir][color]表示在(x, y)格子方 ...
- uva 10047 The Monocycle(搜索)
好复杂的样子..其实就是纸老虎,多了方向.颜色两个状态罢了,依旧是bfs. 更新的时候注意处理好就行了,vis[][][][]要勇敢地开. 不过这个代码交了十几遍的submission error,手 ...
- UVA 10047 The Monocycle
大白图论第二题··· 题意:独轮车的轮子被均分成五块,每块一个颜色,每走过一个格子恰好转过一个颜色. 在一个迷宫中,只能向前走或者左转90度或右转90度(我曾天真的认为是向左走和向右走···),每个操 ...
- Problem A: The Monocycle
uva10047:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...
- UVA 10047-The Monocycle(队列bfs+保存4种状态)
题意:给你一张地图,S代表起点,T代表终点,有一个轮盘,轮盘平均分成5份,每往前走一格恰好转1/5,轮盘只能往前进,但可以向左右转90°,每走一步或是向左向右转90° 要花费1单位的时间,问最少的时间 ...
- UVALive 2035 The Monocycle(BFS状态处理+优先队列)
这道题目真是非常坎坷啊,WA了很多次,但所有的思路都是奔着广搜去想的,一开始出现了比答案大的数据,才想到了应该是优先队列,再说加上也肯定不会错.一开始我读错了题意,以为旋转并且前行需要的时间跟其他一样 ...
随机推荐
- 【linux报错】安装好虚拟机后,挂载光盘报错:mount:you must specify the filesystem type
问题现象: 问题原因: 当时光盘的“已连接”的勾没有勾上 解决后:
- 在WebGL场景中进行棋盘操作的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,建立棋盘状的地块和多个可选择的棋子对象,在点选棋子时显示棋子的移动范围,并且在点击移动范围内的空白地块时向目标地块移动棋子.在这一过程中要 ...
- kali虚拟机安装后操作[配置ssh,安装vmtools,更新源]
更新源 # 打开控制台, 输入以下命令打开编辑器修改配置文件 $ leafpad /etc/apt/sources.list #kali官方源 deb http://http.kali.org/kal ...
- 防csrf详解
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶 ...
- windows c++如何使窗口动态改变位置
在windows软件中,经常会碰到一个功能:鼠标hover在某个地方时会出现窗口,有时候这个窗口的位置是会动态调整的. 熟悉使用windows API,理解windows中虚拟坐标.工作区坐标.屏幕坐 ...
- xlrd模块学习
python常用模块目录 )# 打开Excel文件读取数据 import xlrd workbook = xlrd.open_workbook('mcw_test.xlsx') print(workb ...
- type命令详解
转自:http://codingstandards.iteye.com/blog/831504 在脚本中type可用于检查命令或函数是否存在,存在返回0,表示成功:不存在返回正值,表示不成功. $ t ...
- django之基本配置
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- [2019BUAA软工]第0次代码作业
Visual Studio 单元测试的简单应用 写在前面 笔者根据作业的介绍以及Visual Studio 2017 文档的相关说明,进行了Visual Studio 单元测试的简单应用. Tip ...
- oo第八次作业--5,6,7次作业总结
一.多线程的设计 这三次作业的主要内容就是使用多线程并且解决多线程中出现的问题.而对于多线程我也有了自己的理解.首先明确的一点是单个CPU在同一时间只能处理一件事.那么,不管是多进程还是多线程,我们的 ...