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 }

你可能感兴趣的:(poj)