zoukankan      html  css  js  c++  java
  • codeforces 676D Theseus and labyrinth BFS搜索

    分析:一个n*m的矩阵,每个格子有12个状态,每次按一次,每个格子转90度,所以整个矩阵只有4种状态,然后爆搜就好了

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdlib.h>
    #include <cmath>
    #include <queue>
    using namespace std;
    typedef long long LL;
    const int INF=0x3f3f3f3f;
    const int N=1e3+5;
    struct Node{
      int t,x,y;
    };
    queue<Node>q;
    char c[N][N];
    int  s[4][N][N],n,m;
    char p[]="0+-|^><vLRUD*";
    int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12};
    int b[]={0,1,3,2,5,7,4,6,10,11,9,8,12};
    int dp[4][N][N];
    bool judgel(int x){
      if(x==1||x==2||x==6||x==9||x==10||x==11)
        return true;
      return false;
    }
    bool judger(int x){
      if(x==1||x==2||x==5||x==8||x==10||x==11)
        return true;
      return false;
    }
    bool judgeu(int x){
      if(x==1||x==3||x==4||x==8||x==9||x==11)
        return true;
      return false;
    }
    bool judged(int x){
      if(x==1||x==3||x==7||x==8||x==9||x==10)
        return true;
      return false;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i)
          scanf("%s",c[i]+1);
        for(int i=1;i<=n;++i)
        {
          for(int j=1;j<=m;++j)
          {
            for(int k=1;k<=12;++k)
             if(c[i][j]==p[k])
             {
                s[0][i][j]=a[k];
                break;
             } 
           }
        }
        for(int k=1;k<=3;++k)
        {
          for(int i=1;i<=n;++i)
          {
            for(int j=1;j<=m;++j)
            {
               s[k][i][j]=b[s[k-1][i][j]];
            }
          }
        }
        Node st,aim;
        scanf("%d%d%d%d",&st.x,&st.y,&aim.x,&aim.y);
        memset(dp,-1,sizeof(dp));
        st.t=0;
        q.push(st);dp[0][st.x][st.y]=0;
        int ans=INF;
        while(!q.empty()){
          Node u=q.front();
          q.pop();
          if(u.x==aim.x&&u.y==aim.y){
            break;
          }
          Node e=u;e.t=(e.t+1)%4;
          if(dp[e.t][e.x][e.y]==-1){
            dp[e.t][e.x][e.y]=dp[u.t][e.x][e.y]+1;
            q.push(e);
          }
          if(u.y>1&&judgel(s[u.t][u.x][u.y])&&judger(s[u.t][u.x][u.y-1])){
              if(dp[u.t][u.x][u.y-1]==-1){
                 e=u;--e.y;
                 dp[e.t][e.x][e.y]=dp[u.t][u.x][u.y]+1;
                 q.push(e);
              }
          }
          if(u.y<m&&judger(s[u.t][u.x][u.y])&&judgel(s[u.t][u.x][u.y+1])){
                if(dp[u.t][u.x][u.y+1]==-1){
                 e=u;++e.y;
                 dp[e.t][e.x][e.y]=dp[u.t][u.x][u.y]+1;
                 q.push(e);
              }
          }
          if(u.x>1&&judgeu(s[u.t][u.x][u.y])&&judged(s[u.t][u.x-1][u.y])){
                if(dp[u.t][u.x-1][u.y]==-1){
                 e=u;--e.x;
                 dp[e.t][e.x][e.y]=dp[u.t][u.x][u.y]+1;
                 q.push(e);
              }
          }
          if(u.x<n&&judged(s[u.t][u.x][u.y])&&judgeu(s[u.t][u.x+1][u.y])){
                if(dp[u.t][u.x+1][u.y]==-1){
                 e=u;++e.x;
                 dp[e.t][e.x][e.y]=dp[u.t][u.x][u.y]+1;
                 q.push(e);
              }
          }
        }
        for(int i=0;i<4;++i)
          if(dp[i][aim.x][aim.y]!=-1){
            ans=min(dp[i][aim.x][aim.y],ans);
          }
          if(ans==INF)ans=-1;
         printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    PHP+MYSQL单例模式的滑铁卢
    碰到一个安装SQl2008 Express Edition出错的怪异情况
    用虚拟并口解决向USB条码打印机发送ZPL指令的解决方案
    让excanvas支持动态创建的canvas标签(附演示文件)
    sql 检索语句
    c++ string 类基本用法样例
    Sqlite c/c++ api 学习
    最常见的20种VC++编译错误信息
    C#动态调用C++编写的DLL函数
    C++中将BYTE转16进制字符串
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5530610.html
Copyright © 2011-2022 走看看