codeforces 676D Theseus and labyrinth BFS搜索
分析:一个n*m的矩阵,每个格子有12个状态,每次按一次,每个格子转90度,所以整个矩阵只有4种状态,然后爆搜就好了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }