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 }