zoukankan      html  css  js  c++  java
  • hdu 1728 逃离迷宫 (bfs)

    逃离迷宫

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 12910    Accepted Submission(s): 3090


    Problem Description
      给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
     
    Input
      第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
      第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
     
    Output
      每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
     
    Sample Input
    2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
     
    Sample Output
    no yes
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1175 1072 1026 1180 1254 
     1 //31MS    420K    1366 B    G++
     2 /*
     3 
     4     题意:
     5         是否在转n个弯内重一点到达另一点。
     6         
     7     bfs:
     8         WA了n次,主要是考虑策略时想法错了。
     9         其实每到一个点时就应该把改点以及该方向的点全都遍历一次,这样才能保证
    10     到达改点时是最优策略,其次,因为交叉关系,vis[][]应该放在while判断里面。 
    11 
    12 */
    13 #include<stdio.h>
    14 #include<string.h>
    15 #include<iostream>
    16 #include<algorithm>
    17 #include<queue>
    18 #define N 105
    19 using namespace std;
    20 struct node{
    21     int x,y;
    22     int step; 
    23 };
    24 char g[N][N];
    25 int vis[N][N];
    26 int mov[4][2]={0,1,1,0,0,-1,-1,0};
    27 int k,x1,x2,y1,y2;
    28 int n,m;
    29 int bfs()
    30 {
    31     queue<node>Q;
    32     node t={x1,y1,-1};
    33     Q.push(t);
    34     vis[x1][y1]=1;
    35     while(!Q.empty()){
    36         t=Q.front();
    37         Q.pop();
    38         //printf("%d %d %d
    ",t.x,t.y,t.step);
    39         if(t.x==x2 && t.y==y2 && t.step<=k) return 1;
    40         t.step;
    41         for(int i=0;i<4;i++){
    42             node tt=t;
    43             tt.step++;
    44             tt.x+=mov[i][0];
    45             tt.y+=mov[i][1];
    46             while(tt.x>0 && tt.x<=n && tt.y>0 & tt.y<=m && g[tt.x][tt.y]!='*' ){
    47                 if(!vis[tt.x][tt.y]){
    48                     vis[tt.x][tt.y]=1;
    49                     Q.push(tt);
    50                 }
    51                 tt.x+=mov[i][0];
    52                 tt.y+=mov[i][1];
    53             }
    54         }
    55     }  
    56     return 0;
    57 }
    58 int main(void)
    59 {
    60     int t;
    61     scanf("%d",&t);
    62     while(t--)
    63     {
    64         memset(vis,0,sizeof(vis));
    65         scanf("%d%d",&n,&m);
    66         for(int i=1;i<=n;i++)
    67             scanf("%s",g[i]+1);
    68         scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
    69         if(bfs()) puts("yes");
    70         else puts("no");
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    谈URL中末尾斜杠对SEO的影响
    ORDER BY一个较高级的用法
    MYSQL5.5 提示 Mysq error:Cannot load from mysql.proc
    mysql 数据库信息泄露
    [转]PclZip简介与使用
    通过telnet命令查看memcache运行状态
    [转载]PHP上传问题总结(文件大小检测,大文件上传)
    Silex 基于Symfony2组件的微型框架
    [转]推荐一些不错的计算机书籍
    [转]Beanstalkd简介(job生命周期)
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3601163.html
Copyright © 2011-2022 走看看