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

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

问某人从一个点走向另一个点的最短时间,并且走过的路程是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. 单元测试——测试神器,testng

    为什么用它 建议使用 TestNG 作为 Java 项目的主要单元测试框架,因为 TestNG 在参数化测试.依赖测试以及套件测试(组)方面功能更加强大.TestNG 意味着高级的测试和复杂的集成测试 ...

  2. CI/CD系列

    一.CI/CD系列 什么是CI/CD(译) Docker与CI/CD(转) Docker和CI/CD实战 二.Git 三.GitLab

  3. 如何让mysql按照两个或多个字段排序

    我准备设计一个供求信息的表格,里边包含序号(id)(自动增量),发布日期(time),上次更新(last_time).因为考虑到避免有人不停的重复发布信息来占据前列位置所以设置了last_time这个 ...

  4. git pull fatal: refusing to merge unrelated histories

    1.首先我github有个远程仓库,然后我本地有个仓库 本地仓库我新添加了一个文件,然后我去关联(git remote add origin git@github.com:qshilary/gitte ...

  5. while循环计算规则:内循环—外循环!

    num= 1 #值 =1while num <= 10 : # num(1)小于10 print(num) # 应该打印 这个1的值 num +=1 # num+=1等价于 num再加1 所以这 ...

  6. SICP读书笔记 2.3

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  7. nginx之location(root/alias)

    location配置 1. 语法规则(按优先级) =        表示精确匹配,优先级最高 ^~      表示uri以某个常规字符串开头,用于匹配url路径(而且不对url做编码处理,例如请求/s ...

  8. javascript常用方法和技巧

    浏览器变编辑器 data:text/html, <style type=;right:;bottom:;left:;}</style><div id="e" ...

  9. 2-Seventh Scrum Meeting20151207

    任务分配 闫昊: 今日完成:完成数据库设计. 明日任务:和唐彬讨论接口如何在android实现. 唐彬: 今日完成:读了IOS讨论区后台接口. 明日任务:和闫昊讨论接口如何在android实现. 史烨 ...

  10. 【Alpha】阶段第六次Scrum Meeting

    [Alpha]阶段第六次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 增加教师接口 增加上课信息接口 赵智源 构建后端测试点测试框架 构建后测试点测试框架 肖 ...