Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1180

BFS

View Code
 1 #include <cstdio>
2 #include <cstring>
3 #include <queue>
4 using namespace std;
5 const int N=100;
6 const int dx[4]={0,1,0,-1};
7 const int dy[4]={1,0,-1,0};
8 char maze[N][N];
9 int vis[N][N][2];
10 int n,m,p,t;
11 struct sta
12 {
13 int x,y,dis;
14 };
15 queue<sta> q;
16 int bfs(int x,int y)
17 {
18 while (!q.empty()) q.pop();
19 vis[x][y][0]=1;
20 sta u={x,y,0};
21 q.push(u);
22 while (!q.empty())
23 {
24 u=q.front(); q.pop();
25 int x,y,dis,d,nx,ny;
26 x=u.x; y=u.y; dis=u.dis;
27 if (maze[x][y]=='T') return dis;
28 if (!vis[x][y][(dis+1)%2])
29 {
30 vis[x][y][(dis+1)%2]=1;
31 sta v={x,y,dis+1};
32 q.push(v);
33 }
34 for (d=0;d<4;d++)
35 {
36 nx=x+dx[d]; ny=y+dy[d];
37 if (maze[nx][ny]=='|')
38 {
39 if (d%2!=dis%2) {nx+=dx[d]; ny+=dy[d];}
40 else continue;
41 }
42 if (maze[nx][ny]=='-')
43 {
44 if (d%2==dis%2) {nx+=dx[d]; ny+=dy[d];}
45 else continue;
46 }
47 if (vis[nx][ny][(dis+1)%2] || !maze[nx][ny] || maze[nx][ny]=='*') continue;
48 vis[nx][ny][(dis+1)%2]=1;
49 sta v={nx,ny,dis+1};
50 q.push(v);
51 }
52 }
53 return 0;
54 }
55 int main()
56 {
57 int i,j,x,y,ans;
58 while (~scanf("%d%d",&n,&m))
59 {
60 memset(vis,0,sizeof(vis));
61 memset(maze,0,sizeof(maze));
62 for (i=1;i<=n;i++) scanf("%s",maze[i]+1);
63 for (i=1;i<=n;i++)
64 for (j=1;j<=m;j++)
65 if (maze[i][j]=='S') {x=i; y=j;}
66 ans=bfs(x,y);
67 printf("%d\n",ans);
68 }
69 return 0;
70 }

 

posted on 2012-02-12 10:33  Qiuqiqiu  阅读(404)  评论(0编辑  收藏  举报