O - 鸣人和佐助(优先队列+搜索)

O - 鸣人和佐助

佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?
O - 鸣人和佐助(优先队列+搜索)_第1张图片
已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费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 
#include"string.h"
#include"stdio.h"
#include
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;
}

你可能感兴趣的:(ACM)