zoukankan      html  css  js  c++  java
  • 华容道

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #define MaxN 35

    using namespace std;

    const int
    INF=~0U>>2,
    dx[]={0,0,-1,1},
    dy[]={-1,1,0,0};
    int mat[MaxN][MaxN],dis[MaxN][MaxN][4];
    int step[MaxN][MaxN][4][4];
    int d[MaxN][MaxN];
    int n,m,q,test,ex,ey,sx,sy,tx,ty;

    struct node{
    int x,y;
    };

    struct node2{
    int x,y,k;
    };

    bool inside(int x, int y){
    return (x>=1&&x<=n&&y>=1&&y<=m);
    }

    int spfa(){
    queue<node2> q;
    while(!q.empty()) q.pop();
    for(int k=0;k<4;k++)
    if(dis[sx][sy][k]!=INF)
    q.push((node2){sx,sy,k});
    while(!q.empty()){
    int x=q.front().x;
    int y=q.front().y;
    int k=q.front().k;
    q.pop();
    for(int i=0;i<4;i++){
    int _x=x+dx[i];
    int _y=y+dy[i];
    if(inside(_x,_y))
    if(mat[_x][_y])
    if(step[x][y][k][i]!=INF)
    if(dis[_x][_y][i^1]>dis[x][y][k]+step[x][y][k][i]+1) {
    dis[_x][_y][i^1]=dis[x][y][k]+step[x][y][k][i]+1;
    q.push((node2){_x,_y,i ^ 1 });
    }
    }
    }
    int ans=INF;
    for(int i=0;i<4;i++)
    if(dis[tx][ty][i]<ans)
    ans=dis[tx][ty][i];
    return (ans==INF)? -1:ans;
    }

    int bfs(int sx,int sy,int tx,int ty){
    if(!mat[sx][sy])
    return INF;
    if(!mat[tx][ty])
    return INF;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    d[i][j]=INF;
    d[sx][sy]=0;
    queue<node> q;
    while(!q.empty()) q.pop();
    q.push((node){sx,sy});
    while(!q.empty()){
    if(d[tx][ty]!=INF)
    return d[tx][ty];
    int x=q.front().x;
    int y=q.front().y;
    q.pop();
    for(int i=0;i<4;i++){
    int _x=x+dx[i];
    int _y=y+dy[i];
    if(inside(_x,_y))
    if(mat[_x][_y]&&d[_x][_y]==INF){
    d[_x][_y]=d[x][y]+1;
    q.push((node){_x,_y});
    }
    }
    }
    return INF;
    }

    void init(){
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
    int v=mat[i][j];
    mat[i][j]=0;
    for (int k=0;k<4;k++)
    for (int l=0;l<4;l++)
    step[i][j][k][l]=bfs(i+dx[k],j+dy[k],i+dx[l],j+dy[l]);
    mat[i][j]=v;
    }
    }

    int getAns(){
    scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
    if(sx==tx&&sy==ty)
    return 0;
    if(sx==ex&&sy==ey)
    return -1;
    if(!inside(ex,ey)||!inside(sx,sy)||!inside(tx,ty))
    return -1;
    if(!mat[ex][ey]||!mat[sx][sy]||!mat[tx][ty])
    return -1;
    for(int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    for (int k=0;k<4;k++)
    dis[i][j][k]=INF;
    mat[sx][sy]=0;
    for(int k=0;k<4;k++)
    dis[sx][sy][k]=bfs(ex,ey,sx+dx[k],sy+dy[k]);
    mat[sx][sy]=1;
    return spfa();
    }

    int main(){
    freopen("puzzle.in","r",stdin);
    freopen("puzzle.out","w",stdout);
    scanf("%d%d%d",&n,&m,&test);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    scanf("%d",&mat[i][j]);
    init();
    while(test--)
    printf("%d ",getAns());
    return 0;
    }

  • 相关阅读:
    Linux阶段总结
    Java基础单词总结
    毕业设计
    tips: ubuntu apt sources.list 设置
    Java编程从0到1系列 目录
    EnvironmentError: mysql_config not found
    pyenv 2.7 环境安装MySQL-python ERROR
    dtd语法规则
    HashMap和HashTable之间的区别
    Vector(同步)和ArrayList(异步)异同
  • 原文地址:https://www.cnblogs.com/mavericks/p/5664807.html
Copyright © 2011-2022 走看看