UVA 10047 The Monocycle (状态记录广搜)
| Problem A: The Monocycle |
A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with five different colors as shown in the figure:
The colored segments make equal angles (72o) at the center. A monocyclist rides this cycle on an
grid of square tiles. The tiles have such size that moving forward from the center of one tile to that of the next one makes the wheel rotate exactly 72oaround its own center. The effect is shown in the above figure. When the wheel is at the center of square 1, the midpoint of the periphery of its blue segment is in touch with the ground. But when the wheel moves forward to the center of the next square (square 2) the midpoint of its white segment touches the ground.
Some of the squares of the grid are blocked and hence the cyclist cannot move to them. The cyclist starts from some square and tries to move to a target square in minimum amount of time. From any square either he moves forward to the next square or he remains in the same square but turns 90o left or right. Each of these actions requires exactly 1 second to execute. He always starts his ride facing north and with the midpoint of the green segment of his wheel touching the ground. In the target square, too, the green segment must be touching the ground but he does not care about the direction he will be facing.
Before he starts his ride, please help him find out whether the destination is reachable and if so the minimum amount of time he will require to reach it.
Input
The input may contain multiple test cases.
The first line of each test case contains two integers M and N (
,
) giving the dimensions of the grid. Then follows the description of the grid in M lines of N characters each. The character `#' will indicate a blocked square, all other squares are free. The starting location of the cyclist is marked by `S' and the target is marked by `T'. The input terminates with two zeros for M and N.
Output
For each test case in the input first print the test case number on a separate line as shown in the sample output. If the target location can be reached by the cyclist print the minimum amount of time (in seconds) required to reach it exactly in the format shown in the sample output, otherwise, print ``destination not reachable".
Print a blank line between two successive test cases.
Sample Input
1 3
S#T
10 10
#S.......#
#..#.##.##
#.##.##.##
.#....##.#
##.##..#.#
#..#.##...
#......##.
..##.##...
#.###...#.
#.....###T
0 0
Sample Output
Case #1
destination not reachable Case #2
minimum time = 49 sec
题意:一辆独轮车,他的车轮每72度变一个颜色(蓝,白,绿,黑,红)。。每秒有3种操作,左转,右转,或者前进,前进的时候车轮的颜色会向前进一色.要求出到终点且车轮触底颜色为蓝色的最小时间。
初始时间为轮子触底为蓝,朝向北
思路:
用一个4维数组来存放状态 vis[x][y][颜色][朝向]..然后用BFS广搜,把每个状态的时间记录下来。。如果颜色和x,y对应上终点。就是最小时间。。
#include <stdio.h>
#include <string.h>
int n, m;
int judge;
int tt = 1;
int min;
int d[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int vis[30][30][5][4];
char map[30][30];
struct Q
{
int x;
int y;
int color;
int turn;
int time;
} q[15111]; void bfs(int x, int y)
{
memset(vis, 0, sizeof(vis));
int head = 1;
int rear = 2;
q[head].x = x;
q[head].y = y;
q[head].color = 0;
q[head].turn = 0;
q[head].time = 0;
vis[x][y][0][0] = 1;
while (head < rear)
{
int xx = q[head].x;
int yy = q[head].y;
int xxx = xx + d[q[head].turn][0];
int yyy = yy + d[q[head].turn][1];
int color = (q[head].color + 1) % 5;
int left = (q[head].turn + 3) % 4;
int right = (q[head].turn + 1) % 4;
if (map[xx][yy] == 'T' && q[head].color == 0)
{
judge = 1;
min = q[head].time;
break;
}
if (xxx >= 0 && xxx < n && yyy >= 0 && yyy < m)
{
if (map[xxx][yyy] != '#' && vis[xxx][yyy][color][q[head].turn] == 0)
{
vis[xxx][yyy][color][q[head].turn] = 1;
q[rear].x = xxx;
q[rear].y = yyy;
q[rear].time = q[head].time + 1;
q[rear].color = color;
q[rear].turn = q[head].turn;
rear ++;
}
}
if (vis[xx][yy][q[head].color][right] == 0)
{
vis[xx][yy][q[head].color][right] = 1;
q[rear].x = xx;
q[rear].y = yy;
q[rear].color = q[head].color;
q[rear].time = q[head].time + 1;
q[rear].turn = right;
rear ++;
}
if (vis[xx][yy][q[head].color][left] == 0)
{
vis[xx][yy][q[head].color][left] = 1;
q[rear].x = xx;
q[rear].y = yy;
q[rear].color = q[head].color;
q[rear].time = q[head].time + 1;
q[rear].turn = left;
rear ++;
}
head ++;
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF && n)
{
judge = 0;
memset(q, 0, sizeof(q));
memset(map, 0, sizeof(map));
for (int i = 0; i < n; i ++)
scanf("%s", map[i]);
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
if (map[i][j] == 'S')
{
bfs(i, j);
break;
}
}
}
if (tt != 1)
printf("\n");
printf("Case #%d\n", tt ++);
if (judge)
printf("minimum time = %d sec\n", min);
else
printf("destination not reachable\n");
}
return 0;
}
UVA 10047 The Monocycle (状态记录广搜)的更多相关文章
- UVa 10047 自行车 状态记录广搜
每个格子(x,y,drection,color) #include<iostream> #include<cstdio> #include<cstring> #in ...
- hdu5025 状态压缩广搜
题意: 悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个1只拿一个就行),拿钥匙i之前必须拿到钥匙i-1,打蛇多花费一秒,问救出唐僧并且拿到所有种类 ...
- UVA 10047 - The Monocycle BFS
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 10047 The Monocycle
大白图论第二题··· 题意:独轮车的轮子被均分成五块,每块一个颜色,每走过一个格子恰好转过一个颜色. 在一个迷宫中,只能向前走或者左转90度或右转90度(我曾天真的认为是向左走和向右走···),每个操 ...
- uva 10047 The Monocycle(搜索)
好复杂的样子..其实就是纸老虎,多了方向.颜色两个状态罢了,依旧是bfs. 更新的时候注意处理好就行了,vis[][][][]要勇敢地开. 不过这个代码交了十几遍的submission error,手 ...
- POJ1324贪吃蛇(状态压缩广搜)
题意: 给你一个地图,有的地方能走,有的地方不能走,然后给你一条蛇,问你这条蛇的头部走到1,1的位置的最少步数,注意,和贪吃蛇不太一样,就是蛇咬到自己身体的那个地方,具体怎么不一样自己模拟 ...
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- Oj 24260: Lilypad Pond (神奇广搜题,状态搜索)
题目 为了让奶牛们娱乐和锻炼,约翰建造了一个美丽的池塘.这个池塘是矩形的,可以分成M×N个方格.一些格子是坚固得令人惊讶的莲花,还有一些是岩石,其余的只是美丽,纯净,湛蓝的水.贝西正在练习芭蕾舞,她站 ...
随机推荐
- js 中用Dom2级事件处理函数(改变样式)
下面这些客户端 javascript代码用到了事件,它给一个很重要的事件--“load" 事件注册了一个事件处理程序.同时展示了注册”click“事件处理函数更高级的一种方法 <!do ...
- [转]left join,right join,inner join区别
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- .Net Framework Data Provider可能没有安装
方法一.下载SQL Server Compact 4.0 安装后就可以解决.下载地址是: http://www.microsoft.com/downloads/zh-cn/details.aspx?f ...
- 7个热门开源PHP框架
PHP(Hypertext Preprocessor)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点.虽然有很多其它可供选择的Web开发语言,像:ASP 和Ruby,但是PHP是目 ...
- jquery点击图片选中特效
jquery点击图片选中特效 点击在线预览效果
- 《无懈可击的Web设计》_灵活的文字
常见的方法 body{ font-size:12px; } 使用像素单位的优点: 不管使用哪种浏览器或者设备来查看,文字看起来都大小一致. 为什么这么做不是无懈可击的? 以像素为单位设定文字大小之后, ...
- MAC安装XAMPP的出现无法打开Apache server
安装MAMP后,启动服务时提示Apache启动失败,80端口被占用.查看进程发现存在几个httpd. OS X自带Apache,可是默认是没有启动的.我也没有开启Web共享,怎么就开机启动了呢? 不知 ...
- 防御XSS攻击的七条原则
本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS ...
- WEB SSH之Shellinabox
用起来方便的,参考URL: http://lzw.me/a/shellinabox.html 生成 pem 证书,可以 https 方式启动.pem 证书的格式为公钥加私钥,并以 x509 的格式进行 ...