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 (lxly) and his right foot position (rxry)
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 (xy) 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 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<h&&y>=0&&y<w&&e[x][y]!='X')
        return true;
    return false;
}
int min(int a,int b)
{
    return a<b?a:b;
}
void spfa()
{
    int i,j,x,y,u,v;
    queue<node>q;
    node cur,next;
    cur.t=0;
    for(i=0;i<h;i++)     //起始点入队,左右脚均可
    {
        for(j=0;j<w;j++)
        {
            if(e[i][j]=='S')
            {
                cur.x=i;
                cur.y=j;
                cur.f=-1;
                q.push(cur);
                cur.f=1;
                q.push(cur);
                mark1[i][j]=mark2[i][j]=0;
            }
        }
    }
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        x=cur.x;
        y=cur.y;
        if(cur.f==1)
        {
            next.f=-1;
            for(i=-2;i<=2;i++)
            {
                for(j=-3;j<=-1;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>=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<h;i++)
        {
            for(j=0;j<w;j++)
            {
                cin>>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;
}
时间: 2024-12-26 18:21:39

zoj 3103 Cliff Climbing(spfa )的相关文章

zoj 3103 Cliff Climbing 优先队列+BFS

题目链接: 3103 题意: 一块N X M 的墙壁,求从S点出发 到T点的最短时间 每次只能爬一步,且只能左右脚交替爬行,墙上每个方块中的数字标明方块的"光滑 等级",标有数字t 的方块将花费他t 个单位时间安全地将他的脚踏在上面. 题解: 队列结构体中有4个变量(x,y,步数,固定的脚(0左脚,1右脚)).将所有s点的左脚开始和右脚开始 加入队列 标记数组要有三维 表示用哪只脚访问了这个坐标(x,y) 然后加入优先队列优化 按BFS搜索 第一个到达T的即是答案 代码: #inclu

zoj 3088 Easter Holidays (spfa )

Easter Holidays Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are provides fantastic ski conditions, many ski lifts and slopes of variou

ZOJ 2836 Number Puzzle ( 容斥原理 )

ZOJ 2836 Number Puzzle( 容斥原理 ) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) int m, n, A[11]; LL gcd( LL a, LL b ) { return b == 0 ? a :

ZOJ 3207 80ers&#39; Memory (F)

80ers' Memory Time Limit: 1 Second      Memory Limit: 32768 KB I guess most of us are so called 80ers, which means that we were born in the 1980's. This group of people shared a lot of common memories. For example, the Saint Seiya, the YoYo ball, the

ZOJ 3204 Connect them (C) 最小生成树kruskal

Connect them Time Limit: 1 Second      Memory Limit: 32768 KB You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN). All connections are two-way (that is connecting computers i and j is the sa

zoj 2913 Bus Pass (BFS)

Bus Pass Time Limit: 5 Seconds      Memory Limit: 32768 KB You travel a lot by bus and the costs of all the seperate tickets are starting to add up. Therefore you want to see if it might be advantageous for you to buy a bus pass. The way the bus syst

ZOJ 2477 Magic&#160;Cube(魔方)

ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds      Memory Limit: 65536 KB This is a very popular game for children. In this game, there's a cube, which consists of 3 * 3 * 3 small cubes. We can unwrap the cube, it will become like this: 这是个有名的儿童游戏.游戏

HDU 2680Choose the best route (SPFA)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 百度之星编程大赛--您报名了吗? 杭电ACM 2014暑期集训队--选拔安排~ Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis

poj 1860 Currency Exchange(SPFA)

题目链接:http://poj.org/problem?id=1860 Description Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can b