hdu1044 Collect More Jewels —— dfs + bfs

来源:互联网 发布:战地2 for mac 百度云 编辑:程序博客网 时间:2024/05/16 23:54

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1044


代码如下:

#include<cstdio>//hdu1044 dfs+bfs#include<cstring>#include<queue>#define MAX(a,b) (a>b?a:b)using namespace std;char map[60][60];int dis[15][15],val[15],w,h,l,m,tot,ans, mov[4][2]={0,1,0,-1,1,0,-1,0};int vis2[15],vis1[55][55];struct Node{    int x,y,dist;};void bfs(int sx, int sy, int set){    queue<Node> q;    Node cur;    cur.x = sx, cur.y = sy, cur.dist = 0;    q.push(cur);    vis1[sx][sy] = 1;    while(!q.empty())    {        cur = q.front(), q.pop();        int x = cur.x, y = cur.y, dist = cur.dist;        for(int i = 0; i<4; i++)        {            int xx = x + mov[i][0];            int yy = y + mov[i][1];            if(xx<1 || xx>h || yy<1 || yy>w )                continue;            if(!vis1[xx][yy] && map[xx][yy]!='*')            {                vis1[xx][yy] = 1;                if(map[xx][yy]>='A' && map[xx][yy]<='J')                    dis[set][map[xx][yy]-64] = dist+1;                else if(map[xx][yy]=='<'  )                    dis[set][11] = dist+1;                else if(map[xx][yy]=='@' )                    dis[set][0] = dist+1;                cur.x = xx, cur.y = yy, cur.dist= dist+1;                q.push(cur);            }        }    }}void dfs(int set, int path_dis, int sum){    if( ans==tot) return;//少了这步居然超时    if(set==11)        ans = MAX(ans,sum);    else for(int i = 1; i<=11; i++)    if(!vis2[i] && dis[set][i] && dis[set][i]+path_dis<=l)    {        vis2[i] = 1;        dfs(i, dis[set][i]+path_dis, sum+val[i] );        vis2[i] = 0;    }}int main(){    int T;    scanf("%d",&T);    for(int k = 1; k<=T; k++)    {        scanf("%d%d%d%d",&w,&h,&l,&m);        memset(val,0,sizeof(val));        tot = 0;        for(int i = 1;i<=m;i++)        {            scanf("%d",&val[i]);            tot += val[i];        }        for(int i = 1; i<=h; i++)            scanf("%s",map[i]+1);        memset(dis,0,sizeof(dis));        for(int i = 1; i<=h; i++)        for(int j = 1; j<=w; j++)        {                        memset(vis1,0,sizeof(vis1));            if(map[i][j]=='@') bfs(i,j,0);            else if(map[i][j]=='<') bfs(i,j,11);            else if(map[i][j]>='A' && map[i][j]<='J') bfs(i,j,map[i][j]-64);        }        ans = -1;        memset(vis2,0,sizeof(vis2));        dfs(0,0,0);                printf("Case %d:\n",k);        if(ans>=0)            printf("The best score is %d.\n",ans);        else            puts("Impossible");        if(k<T)  putchar('\n');    }    return 0;}


0 0
原创粉丝点击