loj 1377 (bfs)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1377

思路:这道题只要处理好遇到"*"这种情况就可以搞定了。我们可以用一个vector向量来记录所有的“*”,然后用一个3维数组来判重,并且对于每个状态都加一个标记,判断是否需要立刻转移,值得注意的是转移过后,vector应该立刻清空。

loj 1377 (bfs)
  1 #include <iostream>

  2 #include <cstdio>

  3 #include <cstring>

  4 #include <algorithm>

  5 #include <vector>

  6 #include <queue>

  7 using namespace std;

  8 

  9 const int MAXN = (200 + 20);

 10 const int inf = (1 << 30);

 11 int n,m,ans;

 12 char map[MAXN][MAXN];

 13 vector<pair<int, int> >vet;

 14 

 15 struct Node{

 16     int x, y, step, pre;

 17     bool operator < (const Node &p ) const {

 18         return p.step < step;

 19     }

 20 }st;

 21 

 22 bool mark[MAXN][MAXN][2];

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

 24 

 25 void bfs()

 26 {

 27     memset(mark, false, sizeof(mark));

 28     priority_queue<Node >que;

 29     que.push(st);

 30     mark[st.x][st.y][0]=true;

 31     while(!que.empty()){

 32         Node q, p = que.top();

 33         que.pop();

 34         if(map[p.x][p.y] == 'D'){

 35             ans = p.step;

 36             return ;

 37         }

 38         if(map[p.x][p.y] == '*'){

 39             bool flag = false;

 40             for(int i = 0; i < (int)vet.size(); i++){

 41                 pair<int, int>pp = vet[i];

 42                 if(pp.first == p.x&&pp.second == p.y){

 43                     flag = true;

 44                     continue;

 45                 }

 46                 if(!mark[pp.first][pp.second][1]){

 47                     mark[pp.first][pp.second][1] = true;

 48                     Node tmp;

 49                     tmp.x = pp.first, tmp.y = pp.second, tmp.step = p.step + 1, tmp.pre = 1;

 50                     que.push(tmp);

 51                 }

 52             }

 53             vet.clear();

 54             if(flag)vet.push_back(make_pair(p.x,p.y));

 55             if(p.pre == 0)continue;

 56         }

 57         for(int i = 0; i < 4; i++){

 58             q.x = p.x + dir[i][0];

 59             q.y = p.y + dir[i][1];

 60             if(map[q.x][q.y] == '#')continue;

 61             if(!mark[q.x][q.y][0]){

 62                 mark[q.x][q.y][0] = true;

 63                 q.step = p.step + 1;

 64                 q.pre = 0;

 65                 que.push(q);

 66             }

 67         }

 68     }

 69 }

 70     

 71 int main()

 72 {

 73     int _case,t=1;

 74     scanf("%d",&_case);

 75     while(_case--){

 76         vet.clear();

 77         scanf("%d%d",&n,&m);

 78         for(int i=1; i<=n; i++){

 79             scanf("%s", map[i] + 1);

 80             for(int j=1; j<=m; j++){

 81                  if(map[i][j] == 'P'){

 82                     st.x = i, st.y = j, st.step = 0, st.pre = 0;

 83                 }else if(map[i][j] == '*') {

 84                     vet.push_back(make_pair(i,j));

 85                 } 

 86             }

 87         }

 88         ans = inf;

 89         bfs();

 90         printf("Case %d: ", t++);

 91         if(ans == inf){

 92             puts("impossible");

 93         }else 

 94             printf("%d\n",ans);

 95     }

 96     return 0;

 97 }

 98 

 99 

100 

101         

102         
View Code

 

你可能感兴趣的:(bfs)