UVALive

来源:互联网 发布:广联达软件培训 编辑:程序博客网 时间:2024/06/07 11:05

题意:求一个房间出发,遍历所有指定房间的最短路


由于指定房间的数量特别少(不超过4),枚举其排列。对每个指定房间求出去其余指定房间的最短路(用bfs),然后根据排列来计算最短路径。


#include <iostream>#include<bits/stdc++.h>using namespace std;const int INF=11100000;const int N=110;int dir[4][2]={1,0,-1,0,0,1,0,-1};char s[N][N];int a[N],bx,by,ans,xx[N],yy[N],k,n,m,v[N][N],mp[N][N];struct node{    int x,y,sum;};int main(){    while(~scanf("%d%d",&n,&m)&&(n||m))    {        for(int i=0;i<n;i++)        {            scanf("%s",s[i]);            for(int j=0;j<m;j++)            {                if(s[i][j]=='@')                {                    xx[0]=i;yy[0]=j;                }            }        }        scanf("%d",&k);        for(int i=1;i<=k;i++)        {            scanf("%d%d",&xx[i],&yy[i]);            xx[i]--;yy[i]--;        }        for(int i=1;i<=k;i++)   a[i]=i;        ans=INF;        memset(mp,-1,sizeof(mp));        for(int j=0;j<=k;j++)        {            memset(v,0,sizeof(v));            node t;            t.x=xx[j];t.y=yy[j];            t.sum=0;            v[t.x][t.y]=1;            queue<node>q;            q.push(t);            while(!q.empty())            {                node t=q.front();                q.pop();                for(int i=0;i<=k;i++)                {                    if(t.x==xx[i]&&t.y==yy[i])                    {                        mp[j][i]=t.sum;                    }                }                for(int i=0;i<4;i++)                {                    int tx=t.x+dir[i][0],ty=t.y+dir[i][1];                    if(tx<0||tx>=n||ty<0||ty>=m||s[tx][ty]=='#'||v[tx][ty]==1)    continue;                    v[tx][ty]=1;                    node tt=t;                    tt.x=tx;tt.y=ty;tt.sum=t.sum+1;                    q.push(tt);                }            }        }        do        {            int sum=0,flag=0;            for(int i=1;i<=k;i++)            {                if(mp[a[i-1]][a[i]]==-1)                {                    flag=1;                    break;                }                sum+=mp[a[i-1]][a[i]];            }            if(flag)    continue;            ans=min(sum,ans);        }while(next_permutation(a+1,a+k+1));        if(ans>=INF)    printf("-1\n");        else    printf("%d\n",ans);    }}


原创粉丝点击