poj 1376 bfs

题很简单....但是好多字啊...

唉,,,题意没看清...竟然忘了这个机器人很肥,不能走边界.....

还有就是有个track,起始点与目的地如果有障碍,直接输出-1..

太水了,,简单的题还是错...

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <queue>
  6 
  7 using namespace std;
  8 
  9 #define MAXN 55
 10 
 11 struct point
 12 {
 13     int x,y;
 14     int step;
 15     int face;
 16 };
 17 int n,m;
 18 int map[MAXN][MAXN];
 19 point st,en;
 20 bool vis[MAXN][MAXN][4];
 21 int bfs(point s)
 22 {
 23     memset(vis,0,sizeof(vis));
 24     point cur,tmp;
 25     queue<point>q;
 26     while(!q.empty())
 27         q.pop();
 28     q.push(s);
 29     vis[s.x][s.y][s.face]=1;
 30     while(!q.empty())
 31     {
 32         cur=q.front();
 33         q.pop();
 34         if(cur.x==en.x && cur.y==en.y)
 35             return cur.step;
 36         if(cur.face==0)
 37         {
 38             tmp.x=cur.x;
 39             tmp.y=cur.y;
 40             tmp.face=cur.face;
 41             tmp.step=cur.step+1;
 42             for(int i=1;i<=3;i++)
 43             {
 44                 tmp.y=cur.y-i;
 45                 if(tmp.y<1)//机器人比较肥
 46                     break;
 47                 if(map[tmp.x][tmp.y])
 48                     break;
 49                 if(vis[tmp.x][tmp.y][tmp.face])
 50                     continue;
 51                 vis[tmp.x][tmp.y][tmp.face]=1;
 52                 q.push(tmp);
 53             }
 54             tmp.x=cur.x;
 55             tmp.y=cur.y;
 56             tmp.step=cur.step+1;
 57             tmp.face=1;
 58             if(!vis[tmp.x][tmp.y][tmp.face])
 59             {    
 60                 vis[tmp.x][tmp.y][tmp.face]=1;
 61                 q.push(tmp);
 62             }
 63             tmp.x=cur.x;
 64             tmp.y=cur.y;
 65             tmp.step=cur.step+1;
 66             tmp.face=3;
 67             if(!vis[tmp.x][tmp.y][tmp.face])
 68             {    
 69                 vis[tmp.x][tmp.y][tmp.face]=1;
 70                 q.push(tmp);
 71             }
 72         }
 73         else if(cur.face==1)
 74         {
 75             tmp.x=cur.x;
 76             tmp.y=cur.y;
 77             tmp.face=cur.face;
 78             tmp.step=cur.step+1;
 79             for(int i=1;i<=3;i++)
 80             {
 81                 tmp.x=cur.x-i;
 82                 if(tmp.x<1)
 83                     break;
 84                 if(map[tmp.x][tmp.y])
 85                     break;
 86                 if(vis[tmp.x][tmp.y][tmp.face])
 87                     continue;
 88                 vis[tmp.x][tmp.y][tmp.face]=1;
 89                 q.push(tmp);
 90             }
 91             tmp.x=cur.x;
 92             tmp.y=cur.y;
 93             tmp.step=cur.step+1;
 94             tmp.face=0;
 95             if(!vis[tmp.x][tmp.y][tmp.face])
 96             {    
 97                 vis[tmp.x][tmp.y][tmp.face]=1;
 98                 q.push(tmp);
 99             }
100             tmp.x=cur.x;
101             tmp.y=cur.y;
102             tmp.step=cur.step+1;
103             tmp.face=2;
104             if(!vis[tmp.x][tmp.y][tmp.face])
105             {    
106                 vis[tmp.x][tmp.y][tmp.face]=1;
107                 q.push(tmp);
108             }
109         }
110         else if(cur.face==2)
111         {
112             tmp.x=cur.x;
113             tmp.y=cur.y;
114             tmp.face=cur.face;
115             tmp.step=cur.step+1;
116             for(int i=1;i<=3;i++)
117             {
118                 tmp.y=cur.y+i;
119                 if(tmp.y>m-1)
120                     break;
121                 if(map[tmp.x][tmp.y])
122                     break;
123                 if(vis[tmp.x][tmp.y][tmp.face])
124                     continue;
125                 vis[tmp.x][tmp.y][tmp.face]=1;
126                 q.push(tmp);
127             }
128             tmp.x=cur.x;
129             tmp.y=cur.y;
130             tmp.step=cur.step+1;
131             tmp.face=1;
132             if(!vis[tmp.x][tmp.y][tmp.face])
133             {    
134                 vis[tmp.x][tmp.y][tmp.face]=1;
135                 q.push(tmp);
136             }
137             tmp.x=cur.x;
138             tmp.y=cur.y;
139             tmp.step=cur.step+1;
140             tmp.face=3;
141             if(!vis[tmp.x][tmp.y][tmp.face])
142             {    
143                 vis[tmp.x][tmp.y][tmp.face]=1;
144                 q.push(tmp);
145             }
146         }
147         else if(cur.face==3)
148         {
149             tmp.x=cur.x;
150             tmp.y=cur.y;
151             tmp.face=cur.face;
152             tmp.step=cur.step+1;
153             for(int i=1;i<=3;i++)
154             {
155                 tmp.x=cur.x+i;
156                 if(tmp.x>n-1)
157                     break;
158                 if(map[tmp.x][tmp.y])
159                     break;
160                 if(vis[tmp.x][tmp.y][tmp.face])
161                     continue;
162                 vis[tmp.x][tmp.y][tmp.face]=1;
163                 q.push(tmp);
164             }
165             tmp.x=cur.x;
166             tmp.y=cur.y;
167             tmp.step=cur.step+1;
168             tmp.face=0;
169             if(!vis[tmp.x][tmp.y][tmp.face])
170             {    
171                 vis[tmp.x][tmp.y][tmp.face]=1;
172                 q.push(tmp);
173             }
174             tmp.x=cur.x;
175             tmp.y=cur.y;
176             tmp.step=cur.step+1;
177             tmp.face=2;
178             if(!vis[tmp.x][tmp.y][tmp.face])
179             {    
180                 vis[tmp.x][tmp.y][tmp.face]=1;
181                 q.push(tmp);
182             }
183         }
184     }
185     return -1;
186 }
187 
188 int main()
189 {
190     char c[10];
191     while(scanf("%d%d",&n,&m) && (n+m))
192     {
193         memset(map,0,sizeof(map));
194         for(int i=0;i<n;i++)
195             for(int j=0;j<m;j++)
196             {
197                 int d;
198                 scanf("%d",&d);
199                 if(d)
200                 {
201                     map[i][j]=1;
202                     map[i+1][j]=1;
203                     map[i+1][j+1]=1;
204                     map[i][j+1]=1;
205                 }
206             }
207         scanf("%d%d",&st.x,&st.y);
208         scanf("%d%d",&en.x,&en.y);
209         /*for(int i=0;i<=n;i++)
210         {
211             for(int j=0;j<=m;j++)
212                 printf("%d ",map[i][j]);
213             printf("\n");
214         }*/
215         scanf("%s",&c);
216         //cout<<"face="<<c<<endl;
217         if(c[0]=='w')
218             st.face=0;
219         else if(c[0]=='n')
220             st.face=1;
221         else if(c[0]=='e')
222             st.face=2;
223         else if(c[0]=='s')
224             st.face=3;
225         st.step=0;
226         if(map[st.x][st.y] || map[en.x][en.y])//track
227             puts("-1");
228         else
229             printf("%d\n",bfs(st));
230     }
231     return 0;
232 }
原文地址:https://www.cnblogs.com/Missa/p/2709511.html