华容道

来源:互联网 发布:2017年云计算市场份额 编辑:程序博客网 时间:2024/04/27 16:25

问题 C: 华容道

时间限制: 1 Sec  内存限制: 128 MB

题目描述




#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<queue>#include<map>#include<cstdlib>#include<algorithm>#define V 510#define mod 1000000007#define LL long longusing namespace std;int n,m,md[V][V],inf;int dx[5],dy[5],d[V][V],mb[V][V][5][5];int ex,ey,sx,sy,tx,ty;struct da{int x,y;};int vis[V][V][5],dp[V][V][5];struct dm{int x,y,zz;};queue<da>Q;queue<dm>qq;inline void premd(int x,int y){int xx,yy,zx,zy,mdd,mx,my;memset(d,1,sizeof(d));inf=d[1][1];for(int i=0;i<=3;i++){  xx=x+dx[i];yy=y+dy[i];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy])  {   qq.push((dm){xx,yy,i});  }}da zz;dm ss;while(!qq.empty()){ss=qq.front();qq.pop();mx=ss.x;my=ss.y;mdd=ss.zz;memset(d,1,sizeof(d));d[mx][my]=0;for(int i=0;i<=3;i++){  xx=mx+dx[i];yy=my+dy[i];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&(xx!=x||yy!=y))  {   Q.push((da){xx,yy});   d[xx][yy]=1;  }}while(!Q.empty()){ zz=Q.front();Q.pop(); zx=zz.x; zy=zz.y;for(int i=0;i<=3;i++){  xx=zx+dx[i];yy=zy+dy[i];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&(xx!=x||yy!=y)&&d[xx][yy]==inf&&(xx!=x||yy!=y))  {   Q.push((da){xx,yy});   d[xx][yy]=d[zx][zy]+1;  }}}for(int i=0;i<=3;i++){  xx=x+dx[i];yy=y+dy[i];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy])  {   mb[x][y][mdd][i]=d[xx][yy];  }}}} inline void pre_bfs(){int xx,yy,zx,zy,mdd,mx,my;memset(d,1,sizeof(d));d[ex][ey]=0;for(int i=0;i<=3;i++){  xx=ex+dx[i];yy=ey+dy[i];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&(xx!=sx||yy!=sy))  {   Q.push((da){xx,yy});   d[xx][yy]=1;  }}da zz;while(!Q.empty()){ zz=Q.front();Q.pop(); zx=zz.x; zy=zz.y;for(int i=0;i<=3;i++){  xx=zx+dx[i];yy=zy+dy[i];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&(xx!=sx||yy!=sy)&&d[xx][yy]==inf)  {   Q.push((da){xx,yy});   d[xx][yy]=d[zx][zy]+1;  }}}}inline int bfs(){if(tx==sx&&ty==sy)return 0;int xx,yy,zx,zy,mx,my,zs;memset(dp,1,sizeof(dp));pre_bfs();for(int i=0;i<=3;i++){xx=sx+dx[i];yy=sy+dy[i];if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&d[xx][yy]!=inf){  dp[sx][sy][i]=d[xx][yy];  qq.push((dm){sx,sy,i});  vis[sx][sy][i]=1;}}  dm zz;da ww;while(!qq.empty()){ zz=qq.front();qq.pop(); zx=zz.x; zy=zz.y; zs=zz.zz;  xx=zx+dx[zs];yy=zy+dy[zs];  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&dp[xx][yy][(zs+2)%4]>dp[zx][zy][zs]+1)  {   dp[xx][yy][(zs+2)%4]=dp[zx][zy][zs]+1;   if(!vis[xx][yy][(zs+2)%4])   {    qq.push((dm){xx,yy,(zs+2)%4});vis[xx][yy][(zs+2)%4]=1;   }  }for(int i=0;i<=3;i++){  xx=zx;yy=zy;  if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&md[xx][yy]&&dp[zx][zy][i]>dp[zx][zy][zs]+mb[zx][zy][zs][i])  {   dp[zx][zy][i]=dp[zx][zy][zs]+mb[zx][zy][zs][i];   if(!vis[xx][yy][i])   {    qq.push((dm){xx,yy,i});vis[xx][yy][i]=1;   }  }}vis[zx][zy][zs]=0;   }int ans=min(min(dp[tx][ty][0],dp[tx][ty][1]),min(dp[tx][ty][2],dp[tx][ty][3]));if(ans==inf)return -1;return ans;}inline int haha(){     //freopen("in.txt","r",stdin);//freopen("22.txt","w",stdout); //freopen("PuzzleNOIP2013.in","r",stdin);freopen("PuzzleNOIP2013.out","w",stdout);int q;memset(mb,1,sizeof(mb));cin>>n>>m>>q;for(int i=1;i<=n;i++)  for(int j=1;j<=m;j++)  cin>>md[i][j];  dx[0]=0;dy[0]=-1;  dx[1]=-1;dy[1]=0;  dx[2]=0;dy[2]=1;  dx[3]=1;dy[3]=0;for(int i=1;i<=n;i++)   for(int j=1;j<=m;j++)   if(md[i][j])   premd(i,j);while(q--){cin>>ex>>ey>>sx>>sy>>tx>>ty;cout<<bfs()<<endl;}    return 0; }int gg=haha();int main(){;}


原创粉丝点击