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 mid­point 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 mid­point 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 mid­point 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 (状态记录广搜)的更多相关文章

  1. UVa 10047 自行车 状态记录广搜

    每个格子(x,y,drection,color) #include<iostream> #include<cstdio> #include<cstring> #in ...

  2. hdu5025 状态压缩广搜

    题意:       悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个1只拿一个就行),拿钥匙i之前必须拿到钥匙i-1,打蛇多花费一秒,问救出唐僧并且拿到所有种类 ...

  3. UVA 10047 - The Monocycle BFS

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. UVA 10047 The Monocycle

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

  5. uva 10047 The Monocycle(搜索)

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

  6. POJ1324贪吃蛇(状态压缩广搜)

    题意:       给你一个地图,有的地方能走,有的地方不能走,然后给你一条蛇,问你这条蛇的头部走到1,1的位置的最少步数,注意,和贪吃蛇不太一样,就是蛇咬到自己身体的那个地方,具体怎么不一样自己模拟 ...

  7. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  8. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  9. Oj 24260: Lilypad Pond (神奇广搜题,状态搜索)

    题目 为了让奶牛们娱乐和锻炼,约翰建造了一个美丽的池塘.这个池塘是矩形的,可以分成M×N个方格.一些格子是坚固得令人惊讶的莲花,还有一些是岩石,其余的只是美丽,纯净,湛蓝的水.贝西正在练习芭蕾舞,她站 ...

随机推荐

  1. [C#]『CountdownEvent』任务并行库使用小计

    System.Threading.CountdownEvent  是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定. CountdownEvent  专门用于以下情况:您必须使用 ...

  2. node开子线程模块--tagg2

    tagg2包同样具有tagg包的多线程功能,采用新的node-gyp命令进行编译,同时它跨平台支持,mac,linux,windows下都可以使用,对开发人员的api也更加友好.安装方法很简单,直接n ...

  3. TDirectory.GetLastAccessTime获取指定目录最后访问时间

    使用函数: System.IOUtils.TDirectory.GetLastAccessTime 函数定义: class function GetLastAccessTime(const Path: ...

  4. What is Windows Clustering

    A cluster is a group of independent computer systems, referred to as nodes, working together as a un ...

  5. “父窗口拖动的时候Popup不随着父窗口移动”问题的解决方案

    我们用WPF用的Popup时候会发现,当 StaysOpen=True 的时候,因为Popup不会消失,在父窗口移走的时候Popup仍旧在原地...作者在国外网站上无意间发现了这个解决方案,拿出来给大 ...

  6. C++ 11 笔记 (六) : 随机数

    以前生成一个随机数都是这样: srand(time(NULL)); rand(); 在C++11中,标准库中增加了随机数引擎 std::default_random_engine 这个好东西,然后我们 ...

  7. iOS开发之国际化

    iOS 国际化.根据系统不同的语言自动切换. 首先.选择项目 Add new file -->iOS -->Resource -->Strings File  . 命名为Locali ...

  8. ipad在非viewport 1:1下缩放问题

    1.最小会有980宽度,小于980应设置viewport 2.fix元素使用100%指定宽度时,默认会以min-width或980作为尺寸,可以选择给定与页面缩放时触发定宽来设置宽度,或设置设置bod ...

  9. java.lang.NullPointerException: Attempt to invoke virtual method 'void 、Handler.removeMessages(int)' on a null object reference

    onDestory进行释放Handler时,需要判断null if(null != mHandler) {             mHandler.removeMessages(MSG_CHANGE ...

  10. 修改 Analysis Service 服务器模式

    原网址:http://cathydumas.com/2012/04/23/changing-an-analysis-services-instance-to-tabular-mode/ Say you ...