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;
}

 

posted @ 2014-08-15 13:15  向前走丶不回首  阅读(180)  评论(0编辑  收藏  举报