hdu 1026 Ignatius and the Princess I

 hdu 1026 Ignatius and the Princess I
//hdu 1026 Ignatius and the Princess I

//广搜



#include <stdio.h>

#include <string.h>

#include <queue>



using namespace std;

#define N 105

#define INF 1<<30

#define eps 1e-5

                    // x            y

const int dir[2][4] = {-1, 0, 1, 0, 0, -1, 0, 1};



struct QUE

{

    int x, y, time, step;

}que[1000000];



int line, row, head, cnt, tail;

int pre[100000];

char map[N][N];



bool no_overmap(int x, int y)

{

    if(x >= 0 && x < line && y >= 0 && y < row)

        return true;

    return false;

}



void add(int pri, int x, int y, int step, int time)

{

    pre[++head] = pri;

    que[head].x = x;

    que[head].y = y;

    que[head].step = step;

    que[head].time = time;

}



bool bfs()

{

    head = 0;

    tail = 0;

    que[++head].x = que[head].y = que[head].step = que[head].time = 0;

    map[0][0] = 'X';

    while(tail < head)

    {

        tail++;     //出队

        int x = que[tail].x, y = que[tail].y,

            step = que[tail].step;



        if(que[tail].time > 0)  //若有怪物,要杀完才能过去,这一步就必须停着

        {                   //将杀怪时间减一秒,所需时间加一秒,放入队列

            add(tail, x, y, step + 1, que[tail].time - 1);

            continue;

        }

        else

        {           //刚从队列里出来的状态若到出口,则放回

            if(x == line - 1 && y == row - 1)

                return true;

            for(int i = 0; i < 4; ++i)

            {

                int nx = x + dir[0][i], ny = y + dir[1][i];

                if(no_overmap(nx, ny) && map[nx][ny] != 'X')

                {

                    int time;

                    if(map[nx][ny] >= '0' && map[nx][ny] <= '9')

                        time = map[nx][ny] - '0';

                    else

                        time = 0;

                    add(tail, nx, ny, step + 1, time);



                    map[nx][ny] = 'X';

                }

            }

        }

    }

    return false;

}



void print_road(int now, int x, int y)  //回溯输出

{

    if(pre[now] != 0)

        print_road(pre[now], que[now].x, que[now].y);

    if(que[now].time > 0)

        printf("%ds:FIGHT AT (%d,%d)\n", cnt++, que[now].x, que[now].y);

    else

        printf("%ds:(%d,%d)->(%d,%d)\n", cnt++, que[now].x, que[now].y, x, y);

}



int main()

{

    while(scanf("%d%d", &line, &row) != EOF)

    {

        for(int i = 0; i < line; ++i)

        {

            getchar();

            for(int j = 0; j < row; ++j)

                map[i][j] = getchar();

        }

        if(bfs())

        {

            printf("It takes %d seconds to reach the target position, let me show you the way.\n", que[tail].step);

            cnt = 1;

            print_road(pre[tail], line - 1, row - 1);

        }

        else

            printf("God please help our poor hero.\n");

        puts("FINISH");

    }

    return 0;

}


福建农林大学OJ也有一题和这题差不多

http://acm.fafu.edu.cn/problem.php?id=1190,就是没有Special Judge

要按一定顺序才可以,不能用STL的priority_queue  ,而杭电的可以,因为若把节点放进队列

队列会重新排序,就不会按一定的方向出队了,我这也不是用优先队列做的,可在fafu 一直wa

你可能感兴趣的:(HDU)