zoukankan      html  css  js  c++  java
  • UPC-1521 救援行动【搜索】

    题目描述

    Angel被人抓住关在一个迷宫了!迷宫的长、宽均不超过200,迷宫中有不可以越过的墙以及监狱的看守。Angel的朋友带了一个救援队来到了迷宫中。他们的任务是:接近Angel。我们假设接近Angel就是到达Angel所在的位置。
    假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?

    输入

    第1行两个整数n,m。表示迷宫的大小为n×m。
    以后n行,每行m个字符。其中“#”代表墙,“.”表示可以移动,“x”表示看守,“a”表示Angel,“r”表示救援队伍。字母均为小写。

    输出

    1行,代表救出Angel的最短时间。如果救援小组永远不能达到Angel处,则输出“NO ANSWER”。

    样例输入

    7 8
    #.#####.
    #.a#..r.
    #..#x...
    ..#..#.#
    #...##..
    .#......
    ........
    
    

    样例输出

    13
    
    题目要求最短路径,想到bfs()。不同的是当走到x时,杀死看守也要消耗一个单位的时间。我们可以先做一个预处理,如果我们走到x,只让当前的时间加一,然后加到队列,而不继续往下搜索。接着就是简单的bfs()了。
    不能走到x时,让时间加二,再往下搜索。
     1 #include<cstdio>
     2 #include<queue>
     3 using namespace std;
     4 const int dx[4]={1,-1,0,0};
     5 const int dy[4]={0,0,1,-1};
     6 struct node
     7 {
     8     int x,y,t;
     9 };
    10 char mp[205][205];
    11 bool vis[205][205];
    12 int n,m,sx,sy;
    13 void bfs(int sx,int sy)
    14 {
    15     queue<node>q;
    16     node fre,nex;
    17     fre.x=sx;
    18     fre.y=sy;
    19     fre.t=0;
    20     q.push(fre);
    21     while(!q.empty())
    22     {
    23         fre=q.front();
    24         q.pop();
    25         if(mp[fre.x][fre.y]=='a')
    26         {
    27             printf("%d
    ",fre.t);
    28             return ;
    29         }
    30         else if(mp[fre.x][fre.y]=='x')
    31         {
    32             fre.t++;
    33             mp[fre.x][fre.y]='.';
    34             q.push(fre);
    35             continue;
    36         }
    37         for(int i=0;i<4;i++)
    38         {
    39             int nx=fre.x+dx[i];
    40             int ny=fre.y+dy[i];
    41             if(mp[nx][ny]!='#'&&!vis[nx][ny]&&nx>=0&&nx<n&&ny>=0&&ny<m)
    42             {
    43                 vis[nx][ny]=1;
    44                 nex.x=nx;
    45                 nex.y=ny;
    46                 nex.t=fre.t+1;
    47                 q.push(nex);
    48             }
    49         }
    50     }
    51     printf("NO ANSWER
    ");
    52     return ;
    53 }
    54 int main()
    55 {
    56 //    freopen("in.txt","r",stdin);
    57     scanf("%d%d",&n,&m);
    58     for(int i=0;i<n;i++)
    59     {
    60         for(int j=0;j<m;j++)
    61         {
    62             scanf(" %c",&mp[i][j]);
    63             vis[i][j]=0;
    64             if(mp[i][j]=='r')
    65             {
    66                 sx=i;
    67                 sy=j;
    68             }
    69         }
    70     }
    71     bfs(sx,sy);
    72     return 0;
    73 }
    View Code
    
    
    如有错误,请指正,感谢!
  • 相关阅读:
    WinCE 测试网速
    YII 关联表查询
    YII CMenu配置
    php扩展开发笔记1
    使用Mysql EXPLAIN分析、优化SQL语句
    使用Mysql EXPLAIN分析、优化SQL语句 (续)
    jquery提交中文导致乱码
    *nix 命令记(持续更新)
    php 函数中使用static
    xmlhttprequest获取TransferEncoding:chunked分时编码输出
  • 原文地址:https://www.cnblogs.com/scott527407973/p/9039453.html
Copyright © 2011-2022 走看看