• hdu 1728 搜索求最少的转向次数


    逃离迷宫

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

    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, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。
     
    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
     
    注意:  不能用优先队列    对于某一个点 有可能从某个方向走过了 而不是最优的     
    而下面的方法却能保证一定是最优的
     
     
     
    #include<stdio.h>
    #include<queue>
    #include<string.h>
    using namespace std;
    struct haha
    {
        int x;
        int y;
        int k;
    }q,temp;
    int n,m,kk,x1,y1,x2,y2,vis[111][111];
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    char map[111][111];
    int can(int x,int y)
    {
        if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]!='*'&&!vis[x][y])
            return 1;
        return 0;
    }
    void BFS()
    {
        int i;
        queue<struct haha>que;
        memset(vis,0,sizeof(vis));
        q.x=x1;q.y=y1;q.k=-1;
        que.push(q);
        while(!que.empty())
        {
            temp=que.front();  que.pop();
            if(temp.k>kk) {printf("no
    ");return ;}
            if(temp.x==x2&&temp.y==y2 ) {printf("yes
    ");return;}
            vis[temp.x][temp.y]=1;
            for(i=0;i<4;i++)
            {
                q.x=temp.x+dir[i][0];q.y=temp.y+dir[i][1];
                   while(can(q.x,q.y))
                   {
                       q.k=temp.k+1;
                       que.push(q);
                       q.x=q.x+dir[i][0];
                       q.y=q.y+dir[i][1];
                   }
            }
        }
        printf("no
    ");
    }
    int main()
    {
        int cas,i;
        scanf("%d",&cas);
        while(cas--)
        {
            scanf("%d %d",&n,&m);
            for(i=1;i<=n;i++)
                scanf("%s",map[i]+1);
           scanf("%d %d %d %d %d",&kk,&y1,&x1,&y2,&x2);
           if(x1==x2&&y1==y2)
            {
                printf("yes
    ");
                continue;
            }
            BFS();
        }
        return 0;
    }
    

  • 相关阅读:
    Android 走向MD的配色风格
    Android热点回顾第六期
    C#集合类:动态数组、队列、栈、哈希表、字典(转)
    Google Chrome默认字体设置(Win)
    C# Socket的粘包处理(转)
    设计模式原则总结--读《大话设计模式》有感 <转>
    C#设计模式学习笔记-单例模式(转)
    C# 编写Windows Service(windows服务程序)
    C# 获取农历日期
    C# 中怎么将string转换成int型
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3201122.html
Copyright © 2020-2023  润新知