Zoj 3103 Cliff Climbing (spfa)

Source: Internet
Author: User

Zoj 3103 Cliff Climbing (spfa)

Cliff Climbing Time Limit: 10 Seconds Memory Limit: 32768 KB

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 takesTTime units for him to safely put his foot on a block markedT, 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) Shoshould satisfyLx<RxAnd |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 zerZ limit? Http://www.bkjia.com/kf/ware/vc/ "target =" _ blank "class =" keylink "> memory + Memory + IC4uLiA8ZW0 + cyhoLHcpPC9lbT48YnI + Memory + aDwvZW0 + Memory + dzwvZW0 + Memory" 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 spendTTime 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 shoshould 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


The question is not difficult. It is a little more troublesome. Use spfa.

# Include "stdio. h "# include" string. h "# include" vector "# include" queue "# include" iostream "# include" algorithm "using namespace std; # define N 105 const int inf = (int) 1e10; int w, h, ans; char e [N] [N]; int mark1 [N] [N], mark2 [N] [N]; // The minimum time taken to record the movement of the left and right feet to a certain point: struct node {int x, y, t, f; // f indicates that it is the left foot (-1) or right foot (1)}; bool judge (int x, int y) // determines whether the point can go {if (x> = 0 & x
 
  
= 0 & y
  
   
Q; node cur, next; cur. t = 0; for (I = 0; I
   
    
= Mark1 [u] [v]) continue; next. x = u; next. y = v; mark1 [u] [v] = next. t; q. push (next) ;}}}} if (cur. f =-1) {next. f = 1; for (I =-2; I <= 2; I ++) {for (j = 1; j <= 3; j ++) {if (abs (I) + abs (j) <= 3) {u = x + I; v = y + j; if (judge (u, v )) {if (e [u] [v] = 'T') {ans = min (ans, cur. t); // printf ("% d \ n", ans); continue;} next. t = cur. t + e [u] [v]-'0'; if (next. t> = mark2 [u] [v]) continue; next. x = u; next. y = v; mark2 [u] [v] = next. t; q. push (next) ;}}}}} int main () {int I, j; while (scanf ("% d", & w, & h ), w | h) {for (I = 0; I
    
     
> E [I] [j]; mark1 [I] [j] = mark2 [I] [j] = inf ;}} ans = inf; spfa (); if (ans> = inf) printf ("-1 \ n"); else printf ("% d \ n", ans);} return 0 ;}
    
   
  
 



Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.