zoukankan      html  css  js  c++  java
  • loj 1377 (bfs)

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

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

      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
    ",ans);
     95     }
     96     return 0;
     97 }
     98 
     99 
    100 
    101         
    102         
    View Code
  • 相关阅读:
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Senior NLP Scientist
    微软职位内部推荐-Software Engineer
    微软职位内部推荐-Service Engineer for Office365
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Sr. SE
    微软职位内部推荐-Sr. SW Engineer for Privacy Id
    Kibana常用命令
    API接口规范
  • 原文地址:https://www.cnblogs.com/wally/p/3467975.html
Copyright © 2011-2022 走看看