zoukankan      html  css  js  c++  java
  • hdu 1728 逃离迷宫 *

    逃离迷宫

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


    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
     
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <cctype>
    #include <cstdlib>
    #define INF 0xfffffff
    using namespace std;
    typedef long long ll;
    #define maxn 1010
    int n,m,k,x1,y1,x2,y2,vis[maxn][maxn];
    char mapn[maxn][maxn];
    int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};
    struct node{
        int x;
        int y;
        int step;
    };
    int ok(int x,int y){
        if(x>=1 && x<=m && y>=1 && y<=n && mapn[x][y] == '.')
            return 1;
        return 0;
    }
    void bfs(){
        queue<node> q;
        node p;
        p.x = x1;
        p.y = y1;
        p.step = -1;
        vis[x1][y1] = 1;
        q.push(p);
        while(!q.empty()){
            node now = q.front();
            q.pop();
            int x = now.x;
            int y = now.y;
            for(int i=0;i<4;i++){
                int xx = x + dx[i];
                int yy = y + dy[i];
                while(ok(xx,yy)){//这样一直在一个方向,重新进入,step+1相当于改了方向
                    if(!vis[xx][yy]){//这里不是求最小步数问题,判断vis应该放在这里,因为有时需经过以前的可通过点
                        vis[xx][yy] = 1; 
                        node tmp;
                        tmp.x = xx;
                        tmp.y = yy;
                        tmp.step = now.step + 1;
                        if(tmp.x == x2 && tmp.y == y2 && tmp.step <= k){
                            cout << "yes" << endl;
                            return;
                        } 
                        q.push(tmp);
                    }
                    xx = xx + dx[i];
                    yy = yy + dy[i];                
                }
            }
        }
        cout << "no" << endl;
    }
    int main()
    {
        int T;
        cin >> T;
        while(T--){
            memset(vis,0,sizeof(vis));
            cin >> m >> n;
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    cin >> mapn[i][j];
                } 
            }
            cin >> k >> y1 >> x1 >> y2 >> x2;
            if(y1 == y2 && x1 == x2){
                cout << "yes" << endl;
            }
            else bfs();
        }
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
    Java里的简单替换
    ActionBar
    char、short、int、float、double对应字节
    Java和JDK版本的关系-(转载)
    JFlash ARM对stm32程序的读取和烧录-(转载)
    STM32的时钟系统RCC详细整理(转载)
    STM32F7系列时钟相关问题:HSE模式配置(旁路模式、非旁路模式
    git OpenSSL SSL_connect问题
    keil使用VScode外部编辑器
  • 原文地址:https://www.cnblogs.com/l609929321/p/7228279.html
Copyright © 2011-2022 走看看