HDU 4771 Stealing Harry Potter's Precious(2013 Asia Hangzhou Regional Contest )

来源:互联网 发布:百度开放云域名 编辑:程序博客网 时间:2024/05/16 06:48

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

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<set>#include<map>#include<list>#define mem(x,y)memset(x,y,sizeof(x))#define max(a,b)(a)>(b)?(a):(b)#define min(a,b)(a)<(b)?(a):(b)#define INF 0x1f1f1f1f#define M 10000007#define eps 1e-10using namespace std;typedef long long int LL;typedef __int64 ll;const int maxn=105;struct node{    int x,y;};node q[maxn];struct qq{    int xi,yi,step;};char a[maxn][maxn];int b[maxn][maxn];int vis[maxn][maxn];int V[maxn];int flag;int n,m,k,minn;int fx[4]={1,-1,0,0};int fy[4]={0,0,1,-1};int check(int xx,int yy){    if(xx>=0&&xx<n&&yy>=0&&yy<m&&!vis[xx][yy]&&a[xx][yy]!='#')    {        return 1;    }    return 0;}int bfs(node ss,node ee){    int i;    mem(vis,0);    queue <qq> qi;    while(!qi.empty())    {        qi.pop();    }    qq now,next,start;    start.xi=ss.x;    start.yi=ss.y;    start.step=0;    vis[ss.x][ss.y]=1;    qi.push(start);    while(!qi.empty())    {        now=qi.front();        qi.pop();        //printf("***%d %d\n",now.xi,now.yi);        if(now.xi==ee.x&&now.yi==ee.y)        {            return now.step;        }        for(i=0;i<4;i++)        {            int xxx=now.xi+fx[i];            int yyy=now.yi+fy[i];            if(check(xxx,yyy))            {                next.xi=xxx;                next.yi=yyy;                next.step=now.step+1;                vis[xxx][yyy]=1;                qi.push(next);            }        }    }    return -1;}void dfs(int ii,int ss,int sum){    int i;    V[ii]=1;    if(ss==k)    {        minn=min(minn,sum);        return ;    }    for(i=0;i<=k;i++)    {        if(!V[i]&&b[ii][i]!=INF)        {            if(b[ii][i]==-1)            {                flag=1;            }            dfs(i,ss+1,sum+b[ii][i]);            V[i]=0;        }    }}int main(){    int i,j;    while(~scanf("%d %d",&n,&m))    {        if(n==0&&m==0)break;        int sx,sy;        for(i=0;i<n;i++)        {            for(j=0;j<m;j++)            {                cin>>a[i][j];                if(a[i][j]=='@')                {                    sx=i;                    sy=j;                }            }        }        scanf("%d",&k);        q[0].x=sx;        q[0].y=sy;        int xx,yy;        for(i=1;i<=k;i++)        {            scanf("%d %d",&xx,&yy);            q[i].x=xx-1;            q[i].y=yy-1;        }        mem(b,INF);        for(i=0;i<k;i++)        {            for(j=i+1;j<=k;j++)            {                b[i][j]=bfs(q[i],q[j]);                b[j][i]=b[i][j];            }        }        mem(V,0);        minn=INF;        flag=0;        dfs(0,0,0);        if(flag)printf("-1\n");        else printf("%d\n",minn);    }    return 0;}
0 0
原创粉丝点击