亚瑟王的宫殿

题面

一通丧心病狂的bfs

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

struct pp{
    int l,c;
    int d;
}kn[2000],ki;

int st,r,c;
int dx[8]={1,2,2,1,-1,-2,-2,-1};
int dy[8]={2,1,-1,-2,-2,-1,1,2};
bool v[50][30];
int ans=1000000000,sum,d[50][30][50][30];//d[a,b,c,d] -> (a,b) to (c,d)
queue<pp> q;

bool yuejie(int x,int y)
{
    return (x<=0||x>r||y<=0||y>c);
}

void bfs(int bx,int by)
{
    memset(v,0,sizeof(v));
    q.push((pp){bx,by,0}); v[bx][by]=1; d[bx][by][bx][by]=0;
    while (!q.empty())
    {

        int xx=q.front().l,yy=q.front().c;

        d[bx][by][xx][yy]=q.front().d; q.pop();

        for (int i=0;i<8;i++)
        {
            int x=xx+dx[i],y=yy+dy[i];
            if (!yuejie(x,y)&&!v[x][y]) v[x][y]=1,q.push((pp){x,y,d[bx][by][xx][yy]+1});
        }
    }
}

void print(int x,int y)
{
    for (int i=1;i<=r;i++,cout<<endl)
    for (int j=1;j<=c;j++) cout<<d[i][j][x][y]<<" ";
    cout<<endl;
}

int a(int x){return (x>0)?x:-x;}

int main()
{
    cin>>r>>c;
    memset(d,0x10f,sizeof(d));
    char cross; int line;
    while (cin>>cross>>line)
    {
        if (st==0) st=1,ki.l=line,ki.c=cross-'A'+1;
        else kn[st].l=line,kn[st++].c=cross-'A'+1;
    }
    st--;
    //1,2
    for (int i=1;i<=r;i++)
      for (int j=1;j<=c;j++) bfs(i,j);

    //3,4,5
    for (int i=1;i<=r;i++)
    for (int j=1;j<=c;j++)  //ji he point 
    {
        int sum=0;
//      print(i,j);
        for (int k=1;k<=st;k++) sum+=d[kn[k].l][kn[k].c][i][j];
        ans=min(sum+max(a(ki.l-i),a(ki.c-j)),ans);
        for (int k=1,summ=sum;k<=st;summ=sum,k++)  
        {
            summ-=d[kn[k].l][kn[k].c][i][j];
            for (int ii=max(1,ki.l-3);ii<=min(r,ki.l+3);ii++)   
              for (int jj=max(1,ki.c-3);jj<=min(c,ki.c+3);jj++)
              ans=min(
                summ+d[kn[k].l][kn[k].c][ii][jj]+
                max(a(ii-ki.l),a(jj-ki.c))+d[ii][jj][i][j],ans);
        }
    }
    cout<<ans<<endl;
}

  

posted @ 2019-07-15 13:57  [jackeylove]  阅读(181)  评论(0编辑  收藏  举报