记录编号 439586 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2013]华容道 最终得分 100
用户昵称 GravatarHzoi_QTY 是否通过 通过
代码语言 C++ 运行时间 0.130 s
提交时间 2017-08-21 10:41:58 内存使用 0.22 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
#define mod 1000000007
using namespace std;
int n,m,Q,a[35][35],l[35][35][5][5],d[35][35][5],vis[35][35][5];
int v[35][35],dis[35][35],wz[5][2]={0,0,-1,0,0,1,1,0,0,-1},hhh[5],hh[5]={0,3,4,1,2};
struct zb
{
    int x,y;
    zb(){}
    zb(int x_,int y_){x=x_;y=y_;}
}S,T,kg;
struct dp
{
    int x,y,z;
    dp(){}
    dp(int x_,int y_,int z_){x=x_;y=y_;z=z_;}
};
queue<zb> q;
queue<dp> qq;
void bfs(int x,int y)
{
     memset(dis,30,sizeof(dis));
     dis[x][y]=0;v[x][y]=1;
     q.push(zb(x,y));
     while(!q.empty())
     {
         zb k=q.front();
         for(int i=1;i<=4;i++)
         {
             zb to;to.x=k.x+wz[i][0],to.y=k.y+wz[i][1];
             if(!a[to.x][to.y]||to.x>n||to.x<1||to.y>m||to.y<1)continue;
             if(dis[to.x][to.y]>dis[k.x][k.y]+1)
             {
                  dis[to.x][to.y]=dis[k.x][k.y]+1;
                  if(!v[to.x][to.y])
                  {
                      v[to.x][to.y]=1;
                      q.push(to);
                  }
             }
         }
         q.pop();v[k.x][k.y]=0;
     }
}
void init()
{
     for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
       {
           if(!a[i][j])continue;
           for(int k=1;k<=4;k++)
           {
               a[i][j]=0;
               int x=i+wz[k][0],y=j+wz[k][1];
               //if(x>n||x<1||y>m||y<1)continue;
               bfs(x,y);
               for(int h=1;h<=4;h++)
                  if(h!=k)
                     l[i][j][k][h]=dis[i+wz[h][0]][j+wz[h][1]];
               a[i][j]=1;
           }
       }
}
void spfa()
{
     memset(d,30,sizeof(d));
     for(int i=1;i<=4;i++)
     {
         int x=S.x+wz[i][0],y=S.y+wz[i][1];
         if(!a[x][y]||x<1||x>n||y<1||y>m)continue;
         d[S.x][S.y][i]=hhh[i];vis[S.x][S.y][i]=1;
         qq.push(dp(S.x,S.y,i));
     }
     while(!qq.empty())
     {
          dp k=qq.front();qq.pop();vis[k.x][k.y][k.z]=0;
          int x=k.x+wz[k.z][0],y=k.y+wz[k.z][1];
          if(a[x][y]&&x<=n&&x>=1&&y<=m&&y>=1)
          {
	          if(d[x][y][hh[k.z]]>d[k.x][k.y][k.z]+1)
	          {
	               d[x][y][hh[k.z]]=d[k.x][k.y][k.z]+1;
	               if(!vis[x][y][hh[k.z]])
	               {
	                   vis[x][y][hh[k.z]]=1;
	                   qq.push(dp(x,y,hh[k.z]));
	               }
	          }
      	  }
          for(int j=1;j<=4;j++)
          {
              if(j==k.z||!a[k.x+wz[j][0]][k.y+wz[j][1]])continue;
              dp to;to.x=k.x+wz[j][0];to.y=k.y+wz[j][1],to.z=j;
              if(d[k.x][k.y][j]>d[k.x][k.y][k.z]+l[k.x][k.y][k.z][j])
              {
                   d[k.x][k.y][j]=d[k.x][k.y][k.z]+l[k.x][k.y][k.z][j];
                   if(!vis[k.x][k.y][j])
                   {
                       vis[k.x][k.y][j]=1;
                       qq.push(dp(k.x,k.y,j));
                   }
              }
          }
     }
}
int yjn()
{
    freopen("PuzzleNOIP2013.in","r",stdin);
    freopen("PuzzleNOIP2013.out","w",stdout);
    cin>>n>>m>>Q;
    for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
          scanf("%d",&a[i][j]);
    init();
    while(Q--)
    {
        scanf("%d%d%d%d%d%d",&kg.x,&kg.y,&S.x,&S.y,&T.x,&T.y);
		if(S.x==T.x&&S.y==T.y){printf("0\n");continue;}  
        a[S.x][S.y]=0;
        bfs(kg.x,kg.y);
        a[S.x][S.y]=1;
        for(int i=1;i<=4;i++)hhh[i]=dis[S.x+wz[i][0]][S.y+wz[i][1]];
        spfa();
        int ans=100000000;
            for(int i=1;i<=4;i++)ans=min(ans,d[T.x+wz[i][0]][T.y+wz[i][1]][hh[i]]+1);
        if(ans==100000000)printf("-1\n");
        else printf("%d\n",ans);    
    }
}
int qty=yjn();
int main(){;}