hdu5040 优先队列bfs(较烦)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 char face[]={'E','S','W','N'},map[505][505];
 7 int fac[505][505],vis[505][505][4],n;
 8 int xx[]={1,-1,0,0};
 9 int yy[]={0,0,1,-1};
10 struct dian{
11     friend bool operator<(dian n1,dian n2)
12     {
13         return(n1.time>n2.time);
14     }
15     int x,y,time;
16 };
17 int bfs(int x1,int y1,int x2,int y2)
18 {
19     priority_queue<dian>q; int i,flag;
20     dian n1,n2;
21     while (!q.empty()) q.pop();
22     n1.x=x1; n1.y=y1; n1.time=0; q.push(n1);
23     vis[x1][y1][0]=1;
24     while (!q.empty())
25     {
26         n1=q.top(); q.pop();
27         if (n1.x==x2&&n1.y==y2) return n1.time;
28         if (vis[n1.x][n1.y][(n1.time+1)%4]==0)
29         {
30             vis[n1.x][n1.y][(n1.time+1)%4]=1;
31             n1.time++; q.push(n1); n1.time--;
32         }
33         for (i=0;i<4;i++)
34         {
35             flag=0;
36             if (n1.x+xx[i]<0||n1.x+xx[i]>=n||n1.y+yy[i]<0||n1.y+yy[i]>=n) continue;
37             if (map[n1.x+xx[i]][n1.y+yy[i]]=='#') continue;
38             if (fac[n1.x][n1.y]!=-1||fac[n1.x+xx[i]][n1.y+yy[i]]!=-1) flag=1;
39             if (n1.x>0&&fac[n1.x-1][n1.y]!=-1&&face[(fac[n1.x-1][n1.y]+n1.time%4)%4]=='S') flag=1;
40             if (n1.x<n-1&&fac[n1.x+1][n1.y]!=-1&&face[(fac[n1.x+1][n1.y]+n1.time%4)%4]=='N') flag=1;
41             if (n1.y>0&&fac[n1.x][n1.y-1]!=-1&&face[(fac[n1.x][n1.y-1]+n1.time%4)%4]=='E') flag=1;
42             if (n1.y<n-1&&fac[n1.x][n1.y+1]!=-1&&face[(fac[n1.x][n1.y+1]+n1.time%4)%4]=='W') flag=1;
43             n2.x=n1.x+xx[i]; n2.y=n1.y+yy[i]; n2.time=n1.time;
44              if (n2.x>0&&fac[n2.x-1][n2.y]!=-1&&face[(fac[n2.x-1][n2.y]+n2.time%4)%4]=='S') flag=1;
45             if (n2.x<n-1&&fac[n2.x+1][n2.y]!=-1&&face[(fac[n2.x+1][n2.y]+n2.time%4)%4]=='N') flag=1;
46             if (n2.y>0&&fac[n2.x][n2.y-1]!=-1&&face[(fac[n2.x][n2.y-1]+n2.time%4)%4]=='E') flag=1;
47             if (n2.y<n-1&&fac[n2.x][n2.y+1]!=-1&&face[(fac[n2.x][n2.y+1]+n2.time%4)%4]=='W') flag=1;
48             if (flag==0) n2.time=n1.time+1;
49             else n2.time=n1.time+3;
50             if (vis[n2.x][n2.y][n2.time%4]==1) continue;
51             vis[n2.x][n2.y][n2.time%4]=1;
52             q.push(n2);
53         }
54     }
55     return -1;
56 }
57 int main()
58 {
59     int T,t,i,j,x1,x2,y1,y2;
60     scanf("%d",&T);
61     for (t=1;t<=T;t++)
62     {
63         scanf("%d",&n);
64         getchar();
65         for (i=0;i<n;i++) scanf("%s",map[i]);
66         memset(vis,0,sizeof(vis));
67         memset(fac,-1,sizeof(fac));
68         for (i=0;i<n;i++)
69             for (j=0;j<n;j++)
70         if (map[i][j]=='M') {x1=i; y1=j; }
71         else if (map[i][j]=='T') {x2=i; y2=j; }
72         else if (map[i][j]=='E') fac[i][j]=0;
73         else if (map[i][j]=='S') fac[i][j]=1;
74         else if (map[i][j]=='W') fac[i][j]=2;
75         else if (map[i][j]=='N') fac[i][j]=3;
76         printf("Case #%d: %d\n",t,bfs(x1,y1,x2,y2));
77     }
78 }

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

posted on 2014-09-25 21:01  xiao_xin  阅读(118)  评论(0编辑  收藏  举报

导航