poj 2312 Battle City(优先队列+bfs)

题目链接:http://poj.org/problem?id=2312

题目大意:给出一个n*m的矩阵,其中Y是起点,T是终点,B和E可以走,S和R不可以走,要注意的是走B需要2分钟,走E需要一分钟。最后求解Y--->T的最短时间!!

看到这题首先想到广搜来找最短时间,但是这里可以对B和E进行处理,方便计算~

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <queue>

 4 #include <cstring>

 5 using namespace std;

 6 int dir[4][2]= {1,0,-1,0,0,1,0,-1};

 7 bool vis[310][310];

 8 char map[310][310];

 9 int m,n,sx,sy;

10 struct node

11 {

12     int x,y,time;

13     friend bool operator<(node a,node b)

14     {

15         return a.time>b.time;

16     }

17 };

18 

19 int bfs()

20 {

21     node s,ss,sss;

22     priority_queue<node>q;

23     s.x=sx;

24     s.y=sy;

25     s.time=0;

26     q.push(s);

27     vis[sx][sy]=1;

28     while (!q.empty())

29     {

30         ss=q.top();

31         q.pop();

32         for (int i=0; i<4; i++)

33         {

34             sss.x=ss.x+dir[i][0];

35             sss.y=ss.y+dir[i][1];

36             if (sss.x<0||sss.y<0||sss.x>=n||sss.y>=m||map[sss.x][sss.y]=='R' || map[sss.x][sss.y]=='S'||vis[sss.x][sss.y])

37                 continue;

38                 if (map[sss.x][sss.y]=='B')

39                 sss.time=ss.time+2;

40                 else

41                 sss.time=ss.time+1;

42             //sss.time=ss.time+1;

43             if (map[sss.x][sss.y]=='T')

44                 return sss.time;

45             vis[sss.x][sss.y]=1;

46             q.push(sss);

47         }

48     }

49     return -1;

50 }

51 

52 int main ()

53 {

54     while (~scanf("%d%d",&n,&m))

55     {

56         if (n==0&&m==0)

57             break;

58         memset(vis,0,sizeof(vis));

59         for (int i=0; i<n; i++)

60         {

61             getchar();

62             for (int j=0; j<m; j++)

63             {

64                 scanf("%c",&map[i][j]);

65                 if (map[i][j]=='Y')

66                 {

67                     sx=i;

68                     sy=j;

69                 }

70             }

71         }

72         printf ("%d\n",bfs());

73     }

74     return 0;

75 }
View Code

还有一种,单纯的广搜也是可以的。

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <queue>

 4 #include <cstring>

 5 using namespace std;

 6 int dir[4][2]= {1,0,-1,0,0,1,0,-1};

 7 bool vis[310][310];

 8 char map[310][310];

 9 int m,n,sx,sy;

10 struct node

11 {

12     int x,y,time;

13 };

14 

15 int bfs()

16 {

17     node s,ss,sss;

18     //priority_queue<node>q;

19     queue<node>q;

20     s.x=sx;

21     s.y=sy;

22     s.time=0;

23     q.push(s);

24     vis[sx][sy]=1;

25     while (!q.empty())

26     {

27         ss=q.front();

28         q.pop();

29         for (int i=0; i<4; i++)

30         {

31             sss.x=ss.x+dir[i][0];

32             sss.y=ss.y+dir[i][1];

33             if (sss.x<0||sss.y<0||sss.x>=n||sss.y>=m||map[sss.x][sss.y]=='R' || map[sss.x][sss.y]=='S'||vis[sss.x][sss.y])

34                 continue;

35                 if (map[sss.x][sss.y]=='B')

36                 sss.time=ss.time+2;

37                 else

38                 sss.time=ss.time+1;

39             //sss.time=ss.time+1;

40             if (map[sss.x][sss.y]=='T')

41                 return sss.time;

42             vis[sss.x][sss.y]=1;

43             q.push(sss);

44         }

45     }

46     return -1;

47 }

48 

49 int main ()

50 {

51     while (~scanf("%d%d",&n,&m))

52     {

53         if (n==0&&m==0)

54             break;

55         memset(vis,0,sizeof(vis));

56         for (int i=0; i<n; i++)

57         {

58             getchar();

59             for (int j=0; j<m; j++)

60             {

61                 scanf("%c",&map[i][j]);

62                 if (map[i][j]=='Y')

63                 {

64                     sx=i;

65                     sy=j;

66                 }

67             }

68         }

69         printf ("%d\n",bfs());

70     }

71     return 0;

72 }
View Code

 

你可能感兴趣的:(优先队列)