HDOJ1728(限制转弯的迷宫问题)

用bfs进行深搜,求出每个可达点的最小转弯数

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX_N=105;
char g[MAX_N][MAX_N];
int vis[MAX_N][MAX_N];
int n,m;
int k,sx,sy,ex,ey;
struct node{
    int x,y,turns;
    node(){}
    node(int cy,int cx,int cturns):x(cx),y(cy),turns(cturns){}
};
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
bool judge(int r,int c)
{
    if(1<=r&&r<=m&&1<=c&&c<=n&&g[r][c]==‘.‘)
    {
        return true;
    }
    return false;
}
void bfs()
{
    if(sy==ey&&sx==ex)
    {
        printf("yes\n");
        return;
    }
    queue<node> que;
    que.push(node(sy,sx,-1));
    vis[sy][sx]=1;
    while(!que.empty())
    {
        node now=que.front();que.pop();
        for(int i=0;i<4;i++)
        {
            int ny=now.y+dy[i];
            int nx=now.x+dx[i];
            while(judge(ny,nx))//按一条路深搜
            {
                if(!vis[ny][nx])
                {
                //    printf("%c (%d,%d) %d\n",g[ny][nx],ny,nx,now.turns+1);
                    que.push(node(ny,nx,now.turns+1));
                    vis[ny][nx]=1;
                    if(ny==ey&&nx==ex&&now.turns+1<=k)
                    {
                        printf("yes\n");
                        return ;
                    }
                }
                ny+=dy[i];
                nx+=dx[i];
            }
        }
    }

    printf("no\n");
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d %d",&m,&n);
        scanf("%*c");
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%c",&g[i][j]);
            }
            scanf("%*c");
        }
        scanf("%d %d %d %d %d",&k,&sx,&sy,&ex,&ey);
        bfs();
    }

    return 0;
}
时间: 2024-10-14 03:38:37

HDOJ1728(限制转弯的迷宫问题)的相关文章

(hdu step 4.2.7)逃离迷宫(在有转弯次数的限制的情况下,判断一个点是否能到另一个点)

题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 264 Accepted Submission(s): 85   Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍

HDU - 1728 逃离迷宫(带转弯的dfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:从迷宫的一个点走到另一个点,要求转弯数不能超过k次,并且有可能走不到 典型的走迷宫问题,主要是如何处理转弯和剪枝的问题.转弯的话可以用if(dir!=-1&&i!=dir)来判断. 剪枝:1.找到,返回. 2.超出给定的转弯数,返回 3.刚好到给定的转弯数,但是没到指定要到的点,返回 4.超出给定的地图或碰到障碍物,换个方向走 5.可以从其他路径以更少的转弯次数到达,舍去现在路径,

HDU 1728 逃离迷宫 DFS+标记转弯数+优化

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16764    Accepted Submission(s): 4086 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

hdu 1728 迷宫 给定最大转弯次数

给出起点 终点 以及转弯次数 在<=转弯次数的条件 能否走到终点 Sample Input25 5...** // .可走 *不可走*.**...........*....1 1 1 1 3 //最大转弯次数 起始y 起始x ....5 5...***.**...........*....2 1 1 1 3 Sample Outputnoyes 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio&g

HDU1728 逃离迷宫【BFS】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目大意: 有一个M*N的矩阵迷宫.其中,字符'.'表示此处为空地,字符'*'表示此处为障碍.在迷宫中,只能向 相邻的上.下.左.右方向走.而且在走的时候,转弯最多不能超过k次.给你初始位置(x1,y1),终 止位置(x2,y2),问:是否能从初始位置走到终止位置. 思路: 建立一个结构体,结构体中(x,y)表示当前位置,t表示目前的转弯次数.搜索四个方向,并记录下转弯 数,如果转弯数大于或

HDU1728-逃离迷宫-BFS

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27258    Accepted Submission(s): 6661 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越, 有些地

HDU 1728 逃离迷宫(DFS||BFS)

逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向

逃离迷宫(HDU 1728 BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21384    Accepted Submission(s): 5180 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU1728 从迷宫中逃脱 【方向BFS】

从迷宫中逃脱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15120    Accepted Submission(s): 3650 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置.gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria能够穿越,有