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

    逃离迷宫

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


    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
     
    //不能用优先队列    对于某一个点 有可能从某个方向走过了 而不是最优的     
    //而下面的方法却能保证一定是最优的
    #include <iostream>
    #include <queue>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    struct node
    {
        int x,y,k;
    }t,t1;
    int n,m,kk,x1,x2,y1,y2,v[105][105];
    int d[4][2]={0,1,0,-1,1,0,-1,0}; 
    char a[105][105];
    int safe (int x,int y)
    {
        if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!='*'&&!v[x][y]) 
            return 1;
        return 0;
    }
    void bfs()
    {
        int i;
        queue<struct node>q;
        memset(v,0,sizeof(v));
        t.x=x1;t.y=y1;t.k=-1;
        q.push(t);
        while(!q.empty())
        {
            t1=q.front();q.pop();
            if(t1.k>kk) {printf("no
    ");return ;}
            if(t1.x==x2&&t1.y==y2 ) {printf("yes
    ");return;}
            v[t1.x][t1.y]=1;
            for(i=0;i<4;i++)
            {
                 t.x=t1.x+d[i][0];t.y=t1.y+d[i][1];  
                   while(safe(t.x,t.y))  //一个方向走到不能走
                   {  
                       t.k=t1.k+1;  
                       q.push(t);  
                       t.x=t.x+d[i][0];  
                       t.y=t.y+d[i][1];  
                   }
            }
        }
         printf("no
    ");  
    }  
    int main()
    {
        int T,i,j;
        cin>>T;
        while(T--)
        {
            cin>>n>>m;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    cin>>a[i][j];
                }
            }
            scanf("%d %d %d %d %d",&kk,&y1,&x1,&y2,&x2); 
            if(x1==x2&&y1==y2)  
            {  
                printf("yes
    ");  
                continue;  
            } 
            bfs();
        }
        return 0;
    }
  • 相关阅读:
    UItableView的cell重用机制
    iOS开发中常遇到的面试题
    iOS UIScrollView 的基本用法
    iOS的CocoaPods手动挡到自动挡到导入第三方框架 转发
    iOS之NSPredicate(正则表达式和UIBarController):谓词
    iOS UISearchController 搜索框
    PHP 基本用法及基本知识点
    iOS 九宫格的实现
    iOS XML 系统自带的解析方法
    iOS xml文件的解析方式 XMLDictionary,GDataXMLNode,NSXMLParser 转发自徒步天涯
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271275.html
Copyright © 2011-2022 走看看