HDU Collect More Jewels 1044

BFS + 状态压缩 险过 这个并不是最好的算法 但是写起来比较简单 , 可以AC,但是耗时比较多

下面是代码 就不多说了

 

#include <cstdio>  

#include <cstring>  

#include <algorithm>  

#include <vector>  

#include <queue>

using namespace std; 

#define Max(a,b) (a>b?a:b)

#define Min(a,b) (a>b?a:b)

#define maxn 100



int m, n, time, k, sorce[20];

bool vis[1<<11][51][51];

char map[52][52];



typedef struct

{

    int step;

    int x, y;

    int sorce;

    int stau;

}Point;



int bfs(Point P);



int main()

{

    int i, j, T, ans, count = 1;

    Point P;

    scanf("%d",&T);

    while(T--)

    {

        scanf("%d%d%d%d",&n,&m,&time,&k);

        

        for(i=0; i<k; i++)

            scanf("%d",&sorce[i]);

        

        for(i=0; i<m; i++)

        {

            scanf("%s",map[i]);

            

            for(j=0; j < n; j++)

            {

                if(map[i][j] == '@')

                    P.x = i, P.y = j, P.step = P.sorce = P.stau = 0;

            }

        }

        

        ans = bfs(P);

        

        printf("Case %d:\n",count++);

        if(ans == -1)

            printf("Impossible\n");

        else

            printf("The best score is %d.\n",ans);

        if(T)

            printf("\n");

    }

    return 0;

}



int bfs(Point P)

{

    int i, max = -1, key;

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

    Point Pn;

    queue <Point> q;

    q.push(P);

    memset(vis,0,sizeof(vis));

    vis[P.stau][P.x][P.y] = 1;

    while( !q.empty() )

    {

        P = q.front();

        q.pop();

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

        {

            Pn.x = P.x + dir[i][0];

            Pn.y = P.y + dir[i][1];

            Pn.step = P.step + 1;

            Pn.sorce = P.sorce;

            Pn.stau = P.stau;

            if(Pn.step > time)

                break;

            if(Pn.x>=0 && Pn.x<m && Pn.y>=0 && Pn.y<n && map[Pn.x][Pn.y] != '*')

            {

                if(map[Pn.x][Pn.y] == '<')

                {

                    max = Max(max,Pn.sorce);

                    if(Pn.stau == ((1<<k)-1) )

                        return max;

                }

                else if(map[Pn.x][Pn.y] >= 'A' && map[Pn.x][Pn.y] <= 'J')

                {

                    key = map[Pn.x][Pn.y] - 'A';

                    if( ((Pn.stau)&(1<<key)) == 0 )

                    {

                        Pn.sorce += sorce[key];

                        Pn.stau += 1<<key;

                    }

                }

                if( !vis[Pn.stau][Pn.x][Pn.y])

                {

                    vis[Pn.stau][Pn.x][Pn.y] = 1;

                    q.push(Pn);

                }

                

            }

        }

    }

    return max;

}

 

你可能感兴趣的:(more)