O - 鳴人和佐助(優先隊列+搜索)

O - 鳴人和佐助

佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?
在這裏插入圖片描述
已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每一個單位的查克拉可以打敗一個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動一個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?

input

輸入的第一行包含三個整數:M,N,T。代表M行N列的地圖和鳴人初始的查克拉數量T。0 < M,N < 200,0 ≤ T < 10
後面是M行N列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。

output

輸出包含一個整數R,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。

樣例輸入1
4 4 1

#@##
**##
###+


樣例輸入2

4 4 2
#@##
**##
###+


樣例輸出1

6

樣例輸出2

4

會花思路代碼:
#include <iostream>
#include"string.h"
#include"stdio.h"
#include<queue>
using namespace std;

struct node
{
    int x;
    int y;
    int t;
    int s;
    node(){}
    node(int a,int b,int c,int d)
    {
        x=a;
        y=b;
        t=c;
        s=d;
    }
    bool operator<(const node& a) const
    {

        if(a.s==s)
		{
			return a.t>t;
		}
		else
			return a.s<s;//從小到大
    }
};
int main()
{
    //struct node q1[40000];
    priority_queue<node> q1;
    int n,m,startx,starty,p,q;
    int tail,head;
    int t,ss;
    scanf("%d %d %d",&n,&m,&t);
    char a[205][205]={0};
    int book[205][205]= {0};
    int next1[4][2]= {0,1,1,0,0,-1,-1,0};
        memset(a,0,sizeof(a));
        memset(book,0,sizeof(book));

        for(int i=0; i<n; i++)
        {
            getchar();
            for(int j=0; j<m; j++)
            {
                scanf("%c",&a[i][j]);
                if(a[i][j]=='@')
                {
                    startx=i;
                    starty=j;
                    //printf("r%d %d\n",startx,starty);
                }
                if(a[i][j]=='+')
                {
                    p=i;
                    q=j;
                    //printf("a%d %d\n",p,q);
                }
            }
        }
//        head=1;
//        tail=1;
//        q1[tail].x=startx;
//        q1[tail].y=starty;
//        q1[tail].s=0;
//        tail++;
        q1.push(node(startx,starty,t,0));
        book[startx][starty]=1;
        int flag=0;
        while(!q1.empty())
        {
            for(int k=0; k<4; k++)
            {
                int tx=q1.top().x+next1[k][0];
                int ty=q1.top().y+next1[k][1];
                if(tx<0||tx>=n||ty<0||ty>=m)
                    continue;
                if(book[tx][ty]==0)
                {

//                    q1[tail].x=tx;
//                    q1[tail].y=ty;
//                    q1[tail].s=q1[head].s+1;
//                    tail++;
                    if(a[tx][ty]=='#'&&q1.top().t>=1)
                    {
                           q1.push(node(tx,ty,q1.top().t-1,q1.top().s+1));
                           book[tx][ty]=1;
                    }
                    if(a[tx][ty]=='*')
                        {
                            q1.push(node(tx,ty,q1.top().t,q1.top().s+1));
                            book[tx][ty]=1;
                        }
                }
                if(tx==p&&ty==q)
                {
                    flag=1;
                    ss=q1.top().s+1;
                    break;
                }

            }
            q1.pop();
            if(flag==1)
                break;
        }
        if(flag==1)
        printf("%d\n",ss);
        else
        printf("-1\n");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章