poj 3026 Borg Maze

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3255 Accepted: 1044

      本题其实并不难,就是题意令人太难理解,后来才看出来,题意的意思是从一个出发点‘S’出发寻找‘A’,但是可以并行查找,即在开始的时候就分组,或者是找到一个‘A’以后再分组。求最小的距离。其实就是一个最小生成树问题,只不过加了一个BFS罢了!

代码:

 

  
    
1 #include < stdio.h >
2 #include < string .h >
3 #include < queue >
4   using namespace std;
5   int m,nn; char map[ 55 ][ 55 ];
6 typedef struct node
7 {
8 int x,y,s;
9 }NODE;
10 typedef struct pnode
11 {
12 int s,x,y;
13 bool operator < ( const pnode & a ) const
14 {
15 return a.s < s;
16 }
17 }PNODE;
18 NODE cur,next;PNODE pcur;
19 int bfs( int x, int y)
20 {
21 priority_queue < PNODE > pqu;
22 queue < NODE > qu;
23 int visit[ 55 ][ 55 ];
24 memset(visit, 0 , sizeof (visit));
25 int mark[ 55 ][ 55 ],sum = 0 ,i,tag = 0 ;
26 int dir[ 4 ][ 2 ] = {{ 0 , 1 },{ 0 , - 1 },{ 1 , 0 },{ - 1 , 0 }};
27 pcur.x = x;pcur.y = y;
28 pcur.s = 0 ;
29 pqu.push(pcur);
30 while ( ! pqu.empty())
31 {
32 pcur = pqu.top();
33 while (visit[pcur.x][pcur.y])
34 {
35 pqu.pop();
36 if (pqu.empty ())
37 {
38 tag = 1 ;
39 break ;
40 }
41 pcur = pqu.top();
42 }
43 if (tag)
44 return sum;
45 pqu.pop();
46 visit[pcur.x][pcur.y] = 1 ;
47 sum += pcur.s;
48 cur.x = pcur.x;
49 cur.y = pcur.y;
50 cur.s = 0 ;
51 qu.push(cur);
52 memset(mark, 0 , sizeof (mark));
53 mark[cur.x][cur.y] = 1 ;
54 while ( ! qu.empty())
55 {
56 cur = qu.front();
57 qu.pop();
58 if ( ! visit[cur.x][cur.y] && map[cur.x][cur.y] == ' A ' )
59 {
60 pcur.x = cur.x;
61 pcur.y = cur.y;
62 pcur.s = cur.s;
63 pqu.push(pcur);
64 }
65 for (i = 0 ;i < 4 ;i ++ )
66 {
67 next.x = cur.x + dir[i][ 0 ];
68 next.y = cur.y + dir[i][ 1 ];
69 if (next.x >= 1 && next.x <= m && next.y >= 1 && next.y <= nn && ! mark[next.x][next.y] && map[next.x][next.y] != ' # ' )
70 {
71 mark[next.x][next.y] = 1 ;
72 next.s = cur.s + 1 ;
73 qu.push(next);
74 }
75 }
76 }
77 }
78 return sum;
79 }
80 int main()
81 {
82 int n,i,j,sx,sy;
83 scanf( " %d " , & n);
84 while (n -- )
85 {
86 scanf( " %d%d " , & nn, & m);
87 for (i = 1 ;i <= m;i ++ )
88 {
89 while (getchar() != ' \n ' );
90 for (j = 1 ;j <= nn;j ++ )
91 {
92 scanf( " %c " , & map[i][j]);
93 if (map[i][j] == ' S ' )
94 {
95 sx = i;sy = j;
96 }
97 }
98 }
99 printf( " %d\n " ,bfs(sx,sy));
100 }
101 return 0 ;
102 }

 

你可能感兴趣的:(poj)