首页 > 代码库 > Hdu 4771 Stealing Harry Potter's Precious (搜索)

Hdu 4771 Stealing Harry Potter's Precious (搜索)

题目大意:

地图上有最多4件物品,小偷要全部拿走,问最少的路程。


思路分析:

考虑到物品数量只有4。

可以先用最多5次bfs求出每个目标点到其他目标点的距离。

然后枚举依次拿取物品的顺序,用next_permutation...


#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

char mp[105][105];
struct node
{
    int x,y,step;
};
int dis[5][5];
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
int n,m;

bool ok(node t)
{
    if(t.x >= 0 && t.x < n && t.y>=0 && t.y < m)return true;
    return false;
}
bool vis[105][105];
void bfs(node st,int id)
{
    queue<node>Q;
    memset(vis,false,sizeof vis);
    vis[st.x][st.y]=true;

    node w,e;
    Q.push(st);

    while(!Q.empty())
    {
        w=Q.front();
        Q.pop();

        for(int d=0;d<4;d++)
        {
            e=w;
            e.x+=dx[d];
            e.y+=dy[d];
            e.step++;
            if(ok(e) && !vis[e.x][e.y] && mp[e.x][e.y]!='#')
            {
                if(mp[e.x][e.y]=='0' || mp[e.x][e.y]=='1' || mp[e.x][e.y]=='2' || mp[e.x][e.y]=='3' || mp[e.x][e.y]=='4')
                {
                    dis[id][mp[e.x][e.y]-'0'] = min(e.step,dis[id][mp[e.x][e.y]-'0']);
                    dis[mp[e.x][e.y]-'0'][id] = min(e.step,dis[mp[e.x][e.y]-'0'][id]);
                }
                vis[e.x][e.y]=true;
                Q.push(e);
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0 && m==0)break;

        node init;

        for(int i=0;i<n;i++)
            scanf("%s",mp[i]);

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(mp[i][j]=='@')
                {
                    init.x=i;
                    init.y=j;
                    init.step=0;
                    mp[i][j]='0';
                }
            }
        }

        int test;
        bool can=true;
        scanf("%d",&test);
        for(int i=1;i<=test;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            mp[x-1][y-1]=i+'0';
        }

        memset(dis,0x3f,sizeof dis);

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(mp[i][j]=='0' || mp[i][j]=='1' || mp[i][j] == '2' || mp[i][j]=='3' || mp[i][j]=='4')
                {
                    node st;
                    st.x=i,st.y=j;
                    st.step=0;
                    bfs(st,mp[i][j]-'0');
                }
            }
        }

        for(int i=0;i<test+1;i++)dis[i][i]=0;

        int per[4];
        for(int i=1;i<=test;i++)
        {
            per[i]=i;
        }

        int ans=0x3f3f3f3f;
        per[0]=0;
        do
        {
            int tans=0;
            for(int i=1;i<=test;i++)
            {
                tans+=dis[per[i-1]][per[i]];
            }
            ans=min(tans,ans);
        }while(next_permutation(per+1,per+1+test));

        if(ans!=0x3f3f3f3f)printf("%d\n",ans);
        else printf("-1\n");
    }
    return 0;
}
/*
4 4
#@##
....
####
....
2
2 1
2 4
*/


Hdu 4771 Stealing Harry Potter's Precious (搜索)