ZOJ-3103 Cliff Climbing
来源:互联网 发布:淘宝助理上架宝贝 编辑:程序博客网 时间:2024/06/06 20:45
At 17:00, special agent Jack starts to escape from the enemy camp. There is a cliff in between the camp and the nearest safety zone. Jack has to climb the almost vertical cliff by stepping his feet on the blocks that cover the cliff. The cliff has slippery blocks where Jack has to spend time to take each step. He also has to bypass some blocks that are too loose to support his weight. Your mission is to write a program that calculates the minimum time to complete climbing.
Figure D-1 shows an example of cliff data that you will receive. The cliff is covered with square blocks. Jack starts cliff climbing from the ground under the cliff, by stepping his left or right foot on one of the blocks marked with 'S' at the bottom row. The numbers on the blocks are the "slippery levels". It takes t time units for him to safely put his foot on a block marked with t, where 1 <= t <= 9. He cannot put his feet on blocks marked with 'X'. He completes the climbing when he puts either of his feet on one of the blocks marked with 'T' at the top row.
Figure D-1: Example of Cliff Data
Jack's movement must meet the following constraints. After putting his left (or right) foot on a block, he can only move his right (or left, respectively) foot. His left foot position (lx, ly) and his right foot position (rx, ry) should satisfy lx < rx and | lx - rx | + | ly - ry | <= 3. This implies that, given a position of his left foot in Figure D-2 (a), he has to place his right foot on one of the nine blocks marked with blue color. Similarly, given a position of his right foot in Figure D-2 (b), he has to place his left foot on one of the nine blocks marked with blue color.
Figure D-2: Possible Placements of Feet
Input
The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. Each dataset is formatted as follows:
w h
s(1,1) ... s(1,w)
s(2,1) ... s(2,w)
...
s(h,1) ... s(h,w)
The integers w and h are the width and the height of the matrix data of the cliff. You may assume 2 <= w <= 30 and 5 <= h <= 60. Each of the following h lines consists of w characters delimited by a space. The character s(y, x) represents the state of the block at position (x, y) as follows:
- 'S': Jack can start cliff climbing from this block.
- 'T': Jack finishes climbing when he reaches this block.
- 'X': Jack cannot put his feet on this block.
- '1' - '9' (= t): Jack has to spend t time units to put either of his feet on this block.
You can assume that it takes no time to put a foot on a block marked with 'S' or 'T'.
Output
For each dataset, print a line only having a decimal integer indicating the minimum time required for the cliff climbing, when Jack can complete it. Otherwise, print a line only having "-1" for the dataset. Each line should not have any characters other than these numbers.
Sample Input
6 64 4 X X T T4 7 8 2 X 73 X X X 1 81 2 X X X 61 1 2 4 4 7S S 2 3 X X2 10T 11 X1 X1 X1 11 X1 X1 11 XS S2 10T X1 X1 X1 X1 11 X1 X1 11 XS S10 10T T T T T T T T T TX 2 X X X X X 3 4 X9 8 9 X X X 2 9 X 97 7 X 7 3 X X 8 9 X8 9 9 9 6 3 X 5 X 58 9 9 9 6 X X 5 X 58 6 5 4 6 8 X 5 X 58 9 3 9 6 8 X 5 X 58 3 9 9 6 X X X 5 XS S S S S S S S S S10 72 3 2 3 2 3 2 3 T T1 2 3 2 3 2 3 2 3 23 2 3 2 3 2 3 2 3 43 2 3 2 3 2 3 2 3 53 2 3 1 3 2 3 2 3 52 2 3 2 4 2 3 2 3 5S S 2 3 2 1 2 3 2 30 0
Sample Output
125-12212
/*ID: j.sure.1PROG:LANG: C++*//****************************************/#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <stack>#include <queue>#include <vector>#include <map>#include <string>#include <climits>#include <iostream>#define INF 0x3f3f3f3fusing namespace std;/****************************************/#define LIM nx >= 0 && nx < h && ny >= 0 && ny < wconst int dir[2][9][2] = {{-2, -1, -1, -1, -1, -2, 0, -1, 0, -2, 0, -3, 1, -1, 1, -2, 2, -1}, {-2, 1, -1, 1, -1, 2, 0, 1, 0, 2, 0, 3, 1, 1, 1, 2, 2, 1}};const int N = 65*35;int w, h, dis[2][N], q[N], ans[N];bool inq[2][N];char mat[65][35];void spfa(int rear){int fron = 0;while(fron < rear) {int u = q[fron%N]; fron++;int x = u / w, y = u % w;for(int f = 0; f < 2; f++) {if(inq[1-f][u]) {//右脚在队列当中inq[1-f][u] = false;for(int d = 0; d < 9; d++) {int nx = x + dir[f][d][0], ny = y + dir[f][d][1];//踏出左脚if(LIM && mat[nx][ny] != 'X') {int v = nx*w + ny, val;if(mat[nx][ny] == 'S' || mat[nx][ny] == 'T') val = 0;else val = mat[nx][ny] - '0';if(dis[f][v] > dis[1-f][u] + val) {dis[f][v] = dis[1-f][u] + val;if(!inq[f][v]) {//新的左脚inq[f][v] = true;q[rear%N] = v; rear++;}}}}}}}}int main(){#ifdef J_Sure//freopen("000.in", "r", stdin);//freopen(".out", "w", stdout);#endifwhile(scanf("%d%d", &w, &h), w||h) {int rear = 0;for(int i = 0; i <= h*w; i++) {dis[0][i] = dis[1][i] = INF;inq[0][i] = inq[1][i] = 0;}int cnt = 0;for(int i = 0 ; i < h; i++) {for(int j = 0; j < w; j++) {scanf(" %c", &mat[i][j]);int u = i*w + j;if(mat[i][j] == 'S') {q[rear%N] = u; rear++;dis[0][u] = dis[1][u] = 0;inq[0][u] = inq[1][u] = true;}//起点全部入队if(mat[i][j] == 'T') {ans[cnt++] = i*w + j;}}}spfa(rear);int ret = INF;for(int i = 0; i < cnt; i++) {ret = min(ret, min(dis[0][ans[i]], dis[1][ans[i]]));}//取所有终点的左脚、右脚到达的最小值if(ret == INF) puts("-1");else printf("%d\n", ret);}return 0;}
- ZOJ-3103 Cliff Climbing
- zoj 3103 Cliff Climbing (SPFA)
- zoj 3103 Cliff Climbing(spfa )
- zoj 3103 Cliff Climbing 优先队列+BFS
- poj 3328 Cliff Climbing 题解
- [HDU 2312]Cliff Climbing[BFS]
- poj 3328 Cliff Climbing 最短路 spfa
- zoj 1494 Climbing Worm
- ZOJ 1494 Climbing Worm
- zoj 1494 Climbing Worm
- ZOJ 1494 Climbing Worm
- ZOJ 1494 Climbing Worm
- ZOJ 1494 Climbing Worm
- zoj 1494 Climbing Worm
- zoj 1494 Climbing Worm[水]
- ZOJ 1494 Climbing Worm 数学水题
- HDU 1049/ZOJ 1494 Climbing Worm
- zoj 1383 Binary Numbers&&zoj 1491 Climbing Worm(简单)
- java 工具包常用操作
- 如何解决Mysql中忘记root密码的情况
- Hadoop Pig学习笔记 各种SQL在PIG中实现
- 2014.09.09 周二-没记录
- C#+JQuery+.Ashx+百度Echarts 实现全国省市地图和饼状图动态数据图形报表的统计
- ZOJ-3103 Cliff Climbing
- 虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
- [ACM] zoj 3809 The Himalayas (2014 ACMICPC Regional 牡丹江站网络赛 A题)
- OC门
- AWK实例
- 理解WebKit和Chromium: Android 4.4 上的Chromium WebView
- java基础系列之socket使用之BufferedReader,BufferedWriter出现的问题
- Cocos2d-X 精灵帧动画的实现方法
- 化蝶,化了前世的因与果