码迷,mamicode.com
首页 > 其他好文 > 详细

华容道

时间:2019-09-22 14:40:30      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:--   void   inline   title   ott   using   tchar   tin   fine   

题面

dfs+spfa

# include<iostream>
# include<cstdio>
# include<cstring>
# include<queue>
# define inv inline void
# define ini inline int
# define is isdigit(ch)
# define ge getchar()
using namespace std;
struct o{
    int x,y,dis;
};
int n,m,g,s1,s2,e1,e2,t1,t2,num,tot,minn;
int mv1[4]={0,0,1,-1};
int mv2[4]={1,-1,0,0};
int to[5],en1[5],en2[5],pay[5],h[901];
int d[31][31][31][31][4];
bool use[31][31],vis[31][31],see[31][31],tp[31][31];
bool ll[31][31][31][31];
ini read()
{
    int x=0;
    char ch=ge;
    while(!is)
    ch=ge;
    while(is)
    {
        x=x*10+ch-48;
        ch=ge;
    }
    return x;
}
inv spfa(int x,int y,int k)
{
    queue<o>q;
    d[x][y][x][y][k]=0;
    q.push((o){x,y,0});
    while(!q.empty())
    {
        o t=q.front();
        q.pop();
        see[t.x][t.y]=0;
        for(int i=0;i<4;i++)
          {
              int xxx=t.x+mv1[i],yyy=t.y+mv2[i];
              if(use[xxx][yyy]&&d[x][y][xxx][yyy][k]>d[x][y][t.x][t.y][k]+ll[t.x][t.y][xxx][yyy]&&ll[t.x][t.y][xxx][yyy])
              {
                  d[x][y][xxx][yyy][k]=d[x][y][t.x][t.y][k]+ll[t.x][t.y][xxx][yyy];
                  if(!see[xxx][yyy])
                  {
                      see[xxx][yyy]=1;
                      q.push((o){xxx,yyy,0});
                }
            }
          }
    }
}
inv bfs()
{
    queue<o>q;
    q.push((o){e1,e2,0});
    vis[e1][e2]=0;
    while(!q.empty())
    {
        o t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
          {
              int xx=t.x+mv1[i],yy=t.y+mv2[i];
              if(vis[xx][yy])
            if(xx==s1&&yy==s2)
              {
                  tot++;
                  to[tot]=i;
                  en1[tot]=t.x;
                  en2[tot]=t.y;
                  pay[tot]=t.dis;
            }
              else
              {
                  vis[xx][yy]=0;
                  q.push((o){xx,yy,t.dis+1});
            }
          }
    }
}
inv dfs(int x,int y,int fa1,int fa2,int go,int tott)
{
    if(tott>=minn) return;
    if(x==t1&&y==t2)
    {
        minn=tott;
        return;
    }
    use[x][y]=0;
    for(int i=0;i<4;i++)
      {
          int xx=x+mv1[i],yy=y+mv2[i];
          if(d[fa1][fa2][xx][yy][go]<1e5&&use[xx][yy]&&!tp[xx][yy])
          {
              tp[xx][yy]=1;
              dfs(xx,yy,x,y,i,tott+d[fa1][fa2][xx][yy][go]+1);
              tp[xx][yy]=0;
        }
      }
    use[x][y]=1;
}
int main()
{
    memset(d,1,sizeof(d));
    n=read(),m=read(),g=read();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        use[i][j]=read();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
       for(int k=0;k<4;k++)
         {
             int xx=i+mv1[k],yy=j+mv2[k];
             if(use[xx][yy])
             {
                 ll[xx][yy][i][j]=1;
                 ll[i][j][xx][yy]=1;
            }
         }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        for(int k=0;k<4;k++)
          {
              int xx=i+mv1[k],yy=j+mv2[k];
             if(use[i][j]&&use[xx][yy])
             {
                 use[xx][yy]=0;
                 spfa(i,j,k);
                 use[xx][yy]=1;
            }
          }
    while(g--)
    {
        tot=0;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            vis[i][j]=use[i][j];
        e1=read(),e2=read(),s1=read(),s2=read(),t1=read(),t2=read();
        if(s1==t1&&s2==t2)
        {
            printf("0\n");
            continue;
        }
        bfs();
        if(!tot)
        {
            printf("-1\n");
            continue;
        }
        minn=9999999;
        for(int i=1;i<=tot;i++)
          dfs(s1,s2,en1[i],en2[i],to[i],pay[i]);
        printf("%d\n",(minn==9999999)?-1:minn);
    }
    return 0;
}

  

华容道

标签:--   void   inline   title   ott   using   tchar   tin   fine   

原文地址:https://www.cnblogs.com/ainiyuling/p/11567333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!