程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zoj 3103 Cliff Climbing(spfa )

zoj 3103 Cliff Climbing(spfa )

編輯:C++入門知識

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 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 zerZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS4gRWFjaCBkYXRhc2V0IGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzOjwvcD4KPHA+PC9wPgo8YmxvY2txdW90ZT48ZW0+dyBoPGJyPgpzKDEsMSk8L2VtPiAuLi4gPGVtPnMoMSx3KTxicj4KcygyLDEpPC9lbT4gLi4uIDxlbT5zKDIsdyk8L2VtPjxicj4KLi4uIDxicj4KPGVtPnMoaCwxKTwvZW0+IC4uLiA8ZW0+cyhoLHcpPC9lbT48YnI+CjwvYmxvY2txdW90ZT4KPHA+PC9wPgo8cD5UaGUgaW50ZWdlcnMgPGVtPnc8L2VtPiBhbmQgPGVtPmg8L2VtPiBhcmUgdGhlIHdpZHRoIGFuZCB0aGUgaGVpZ2h0IG9mIHRoZSBtYXRyaXggZGF0YSBvZiB0aGUgY2xpZmYuIFlvdSBtYXkgYXNzdW1lIDIgPD0gPGVtPnc8L2VtPiA8PSAzMCBhbmQgNSA8PSA8ZW0+aDwvZW0+IDw9IDYwLiBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgPGVtPmg8L2VtPiBsaW5lcyBjb25zaXN0cyBvZiA8ZW0+dzwvZW0+IGNoYXJhY3RlcnMgZGVsaW1pdGVkIGJ5IGEgc3BhY2UuCiBUaGUgY2hhcmFjdGVyIDxlbT5zKHksIHgpPC9lbT5yZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2sgYXQgcG9zaXRpb24gKDxlbT54PC9lbT4sIDxlbT55PC9lbT4pIGFzIGZvbGxvd3M6PC9wPgoK"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 6
4 4 X X T T
4 7 8 2 X 7
3 X X X 1 8
1 2 X X X 6
1 1 2 4 4 7
S S 2 3 X X
2 10
T 1
1 X
1 X
1 X
1 1
1 X
1 X
1 1
1 X
S S
2 10
T X
1 X
1 X
1 X
1 1
1 X
1 X
1 1
1 X
S S
10 10
T T T T T T T T T T
X 2 X X X X X 3 4 X
9 8 9 X X X 2 9 X 9
7 7 X 7 3 X X 8 9 X
8 9 9 9 6 3 X 5 X 5
8 9 9 9 6 X X 5 X 5
8 6 5 4 6 8 X 5 X 5
8 9 3 9 6 8 X 5 X 5
8 3 9 9 6 X X X 5 X
S S S S S S S S S S
10 7
2 3 2 3 2 3 2 3 T T
1 2 3 2 3 2 3 2 3 2
3 2 3 2 3 2 3 2 3 4
3 2 3 2 3 2 3 2 3 5
3 2 3 1 3 2 3 2 3 5
2 2 3 2 4 2 3 2 3 5
S S 2 3 2 1 2 3 2 3
0 0

Sample Output

12
5
-1
22
12


題目並不難,稍微麻煩一點。用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];  //記錄左右腳走到某一點時的最小時間
struct node
{
    int x,y,t,f;     //f記錄走到該點是左腳(-1)還是右腳(1)
};
bool judge(int x,int y)     //判斷該點是否能走
{
    if(x>=0&&x=0&&yq;
    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%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;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved