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 }
  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3601163.html
Copyright © 2011-2022 走看看