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\n",ans);
    return 0;
}
View Code

 

posted @ 2016-05-26 12:11  shuguangzw  阅读(270)  评论(0编辑  收藏  举报