hdu 1728 逃离迷宫

逃离迷宫

#include<iostream>
#include<queue>
#include<stdio.h> 
using namespace std;
struct Node
{
    int x;
    int y;
};
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char map[102][102];
int m,n,step;
int ok,sx,sy,ex,ey;
int mark[102][102];
void Init()
{
    int i,j;
    cin>>m>>n;
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
                mark[i][j] = -1;
    for(i=0;i<m;i++)
        scanf("%s",map[i]);
    scanf("%d%d%d%d%d",&step,&sy,&sx,&ey,&ex);
    sx --;    
    sy --;
    ex --;
    ey --;
}

void bfs()
{
    int k,turns;
    Node q,p;    
    queue<Node>Q;
    p.x = sx;
    p.y = sy;
    Q.push(p);
    while(!Q.empty())
    {
        q = Q.front();
        Q.pop();
        turns = mark[q.x][q.y] + 1;
        for(k=0;k<4;k++)//四方向,每个方向都走到底 
        {
            p.x = q.x+dir[k][0];
              p.y = q.y+dir[k][1];                            
            while(p.x>=0 && p.x<m && p.y>=0 && p.y<n && map[p.x][p.y] == '.')//
            {
                if(mark[p.x][p.y] == -1)
                {                   
                    if(p.x == ex && p.y== ey && turns <= step )
                    {//最先搜到的就是最优的, 
                           ok = 1;
                        return ;
                    }        
                    mark[p.x][p.y] = turns;          
                    Q.push(p);                                   
                }
                p.x += dir[k][0];
                p.y += dir[k][1]; 
            }
        }//for(k=0;k<4;k++)
    }//while(!Q.empty())
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        Init();
        if(sx==ex&&sy==ey)
        {
            printf("yes\n");
            continue;
        }
        ok = 0;
        bfs();
        if( ok == 1)
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值