input:temple.in output:temple.out
时间限制:
1500 ms 空间限制: 524288 KB 具体限制
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct way 4 { 5 bool up[1010][1010]; 6 bool left[1010][1010]; 7 bool right[1010][1010]; 8 bool down[1010][1010]; 9 }a[4]; 10 int n,m,f[4000100],x1,y2,x2,y3,b[4000100][3],d[4000100],next[4]={1,2,3,0}; 11 bool sf[1010][1010][4]; 12 char a1[1010][1010]; 13 void bfs() 14 { 15 int head=0,tail=1,x,y,z,nx,ny,nz; 16 b[1][0]=x1; 17 b[1][1]=y2; 18 b[1][2]=0; 19 while(head<tail) 20 { 21 head++; 22 x=b[head][0]; 23 y=b[head][1]; 24 z=b[head][2]; 25 if(x==x2 && y==y3) 26 { 27 cout<<f[head]; 28 return; 29 } 30 if(x+1<=n) 31 { 32 if(a[z].down[x][y]==1 && a[z].up[x+1][y]==1 && sf[x+1][y][z]==0) 33 { 34 tail++; 35 b[tail][0]=x+1; 36 b[tail][1]=y; 37 b[tail][2]=z; 38 f[tail]=f[head]+1; 39 sf[x+1][y][z]=1; 40 } 41 } 42 if(x-1>=1) 43 { 44 if(a[z].down[x-1][y]==1 && a[z].up[x][y]==1 && sf[x-1][y][z]==0) 45 { 46 tail++; 47 b[tail][0]=x-1; 48 b[tail][1]=y; 49 b[tail][2]=z; 50 f[tail]=f[head]+1; 51 sf[x-1][y][z]=1; 52 } 53 } 54 if(y+1<=m) 55 { 56 if(a[z].right[x][y]==1 && a[z].left[x][y+1]==1 && sf[x][y+1][z]==0) 57 { 58 tail++; 59 b[tail][0]=x; 60 b[tail][1]=y+1; 61 b[tail][2]=z; 62 f[tail]=f[head]+1; 63 sf[x][y+1][z]=1; 64 } 65 } 66 if(y-1>=1) 67 { 68 if(a[z].right[x][y-1]==1 && a[z].left[x][y]==1 && sf[x][y-1][z]==0) 69 { 70 tail++; 71 b[tail][0]=x; 72 b[tail][1]=y-1; 73 b[tail][2]=z; 74 f[tail]=f[head]+1; 75 sf[x][y-1][z]=1; 76 } 77 } 78 if(sf[x][y][next[z]]==0) 79 { 80 tail++; 81 b[tail][0]=x; 82 b[tail][1]=y; 83 b[tail][2]=next[z]; 84 f[tail]=f[head]+1; 85 sf[x][y][next[z]]=1; 86 } 87 } 88 cout<<-1; 89 } 90 int main() 91 { 92 freopen("temple.in","r",stdin); 93 freopen("temple.out","w",stdout); 94 cin>>n>>m; 95 for(int i=1;i<=n;i++) 96 for(int j=1;j<=m;j++) 97 { 98 cin>>a1[i][j]; 99 if(a1[i][j]=='+') {a[0].down[i][j]=1;a[0].left[i][j]=1;a[0].right[i][j]=1;a[0].up[i][j]=1;} 100 else if(a1[i][j]=='-'){a[0].down[i][j]=0;a[0].left[i][j]=1;a[0].right[i][j]=1;a[0].up[i][j]=0;} 101 else if(a1[i][j]=='|'){a[0].down[i][j]=1;a[0].left[i][j]=0;a[0].right[i][j]=0;a[0].up[i][j]=1;} 102 else if(a1[i][j]=='^'){a[0].down[i][j]=0;a[0].left[i][j]=0;a[0].right[i][j]=0;a[0].up[i][j]=1;} 103 else if(a1[i][j]=='>'){a[0].down[i][j]=0;a[0].left[i][j]=0;a[0].right[i][j]=1;a[0].up[i][j]=0;} 104 else if(a1[i][j]=='<'){a[0].down[i][j]=0;a[0].left[i][j]=1;a[0].right[i][j]=0;a[0].up[i][j]=0;} 105 else if(a1[i][j]=='v'){a[0].down[i][j]=1;a[0].left[i][j]=0;a[0].right[i][j]=0;a[0].up[i][j]=0;} 106 else if(a1[i][j]=='L'){a[0].down[i][j]=1;a[0].left[i][j]=0;a[0].right[i][j]=1;a[0].up[i][j]=1;} 107 else if(a1[i][j]=='R'){a[0].down[i][j]=1;a[0].left[i][j]=1;a[0].right[i][j]=0;a[0].up[i][j]=1;} 108 else if(a1[i][j]=='U'){a[0].down[i][j]=1;a[0].left[i][j]=1;a[0].right[i][j]=1;a[0].up[i][j]=0;} 109 else if(a1[i][j]=='D'){a[0].down[i][j]=0;a[0].left[i][j]=1;a[0].right[i][j]=1;a[0].up[i][j]=1;} 110 else if(a1[i][j]=='*'){a[0].down[i][j]=0;a[0].left[i][j]=0;a[0].right[i][j]=0;a[0].up[i][j]=0;} 111 } 112 for(int i=1;i<=n;i++) 113 for(int j=1;j<=m;j++) 114 { 115 for(int l=1;l<=3;l++) 116 { 117 if(a[l-1].down[i][j]) a[l].left[i][j]=1; 118 else a[l].left[i][j]=0; 119 if(a[l-1].left[i][j]) a[l].up[i][j]=1; 120 else a[l].up[i][j]=0; 121 if(a[l-1].right[i][j]) a[l].down[i][j]=1; 122 else a[l].down[i][j]=0; 123 if(a[l-1].up[i][j]) a[l].right[i][j]=1; 124 else a[l].right[i][j]=0; 125 } 126 } 127 cin>>x1>>y2>>x2>>y3; 128 bfs(); 129 return 0; 130 }