求助
查看原帖
求助
173918
swl3992楼主2020/7/11 17:15
#include <bits/stdc++.h>
using namespace std;
string mp[30];
int w,h,n;
int cnt;
int X[]={1,-1,0,0,0};
int Y[]={0,0,1,-1,0};
int d[300][300][300];
int deg[300];
int s[4],t[4];
int G[300][5];
int ID(int a,int b,int c)
{
    return (a<<16)|(b<<8)|c;
}
bool die(int a,int b,int a2,int b2)
{
    return a2==b2||(a2==b&&b2==a);
}
int bfs()
{
    queue<int> q;
    q.push(ID(s[0],s[1],s[2]));
    memset(d,-1,sizeof(d));
    d[s[0]][s[1]][s[2]]=0;
    while(!q.empty())
    {
        int f=q.front();
        q.pop();
        int a=(f>>16)&0xff;
        int b=(f>>8)&0xff;
        int c=f&0xff;
        if(a==t[0]&&b==t[1]&&c==t[2])
        {
            return d[a][b][c];
        }
        for(int i=0;i<deg[a];i++)
        {
            int a2=G[a][i];
            for(int j=0;j<deg[b];j++)
            {
                int b2=G[b][j];
                if(die(a,b,a2,b2))
                {
                    continue;
                }
                for(int k=0;k<deg[c];k++)
                {
                    int c2=G[c][k];
                    if(die(a,c,a2,c2))
                    {
                        continue;
                    }
                    if(die(b,c,b2,c2))
                    {
                        continue;
                    }
                    if(d[a2][b2][c2]!=-1)
                    {
                        continue;
                    }
                    d[a2][b2][c2]=d[a][b][c]+1;
                    q.push(ID(a2,b2,c2));
                }
            }
        }
    }
    return -1;
}
int main()
{
    while(cin>>w>>h>>n&&w&&h)
    {
        getchar();
        for(int i=0;i<h;i++)
        {
            getline(cin,mp[i]);
            cout<<mp[i]<<endl;
        }
        cnt=0;
        int x[300],y[300];
        int id[20][20];
        for(int i=0;i<h;i++)
        {
            for(int j=0;j<w;j++)
            {
                if(mp[i][j]!='#')
                {
                    x[cnt]=i;
                    y[cnt]=j;
                    id[i][j]=cnt;
                    if(islower(mp[i][j]))
                    {
                        s[mp[i][j]-'a']=cnt;
                    }
                    else if(isupper(mp[i][j]))
                    {
                        t[mp[i][j]-'A']=cnt;
                    }
                    cnt++;
                }
            }
        }
        for(int i=0;i<cnt;i++)
        {
            deg[i]=0;
            for(int dir=0;dir<5;dir++)
            {
                int nx=x[i]+X[dir],ny=y[i]+Y[dir];
                if(mp[nx][ny]!='#')
                {
                    G[i][deg[i]++]=id[nx][ny];
                }
            }
        }
        if(n<=2)
        {
            deg[cnt]=1;
            G[cnt][0]=cnt;
            s[2]=t[2]=cnt;
            cnt++;
        }
        if(n<=1)
        {
            deg[cnt]=1;
            G[cnt][0]=cnt;
            s[1]=t[1]=cnt;
            cnt++;
        }
        cout<<bfs()<<endl;
    }
    return 0;
}

总是输出-1

2020/7/11 17:15
加载中...