华容道
来源:互联网 发布: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(){;}
阅读全文
0 0
- 华容道
- 华容道
- 华容道
- 华容道
- 华容道!
- 华容道
- 华容道
- 华容道
- j2me华容道
- 华容道博弈
- 华容道游戏
- 华容道 游戏
- 华容道求解
- 华容道游戏
- Java 华容道
- Java-华容道
- 华容道小游戏
- 实现华容道
- 读飘零雾雨版css3.0版 本笔记
- Maximum Increase
- 字符串置换
- LeetCode-82. Remove Duplicates from Sorted List II
- navigation右侧添加多个按钮(三种方法)
- 华容道
- MFC创建一个新窗体并显示
- springmvc----参数校验
- “hello, world” 起源及其他(转)
- A
- 文件上传 服务端代码
- HDU
- 约瑟夫环问题讲解
- 字符集与字符编码的初步认识