JZ初中OJ 2296. [noip普及组2]神殿

题目描述

 

输入

输出

 

样例输入

样例输入1
2 2
+*
*U
1 1 2 2
样例输入2
2 3
<><
><>
1 1 2 1

样例输出

样例输出1
-1
样例输出2
4
 

数据范围限制

 

提示

题目标中的特殊符号:<>^v+*|-
  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 }

猜你喜欢

转载自www.cnblogs.com/anbujingying/p/11329453.html