码迷,mamicode.com
首页 > 其他好文 > 详细

(水搜索 hdu 1728)

时间:2015-04-06 23:03:38      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

逃离迷宫

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


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<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
#define INF 100000000
int tt,n,m,k,sx,sy,ex,ey;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
char s[105][105];
bool vis[105][105];
int w[105][105];
struct node
{
    int x,y;
};
bool check(int x,int y)
{
    if(x<0||y<0||x>=n||y>=m)
        return false;
    return true;
}
void bfs()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            w[i][j]=INF;
    }
    queue<node> q;
    node fr,nt;
    fr.x=sx,fr.y=sy;
    w[sx][sy]=-1;
    q.push(fr);
    while(!q.empty())
    {
        fr=q.front(),q.pop();
        if(fr.x==ex&&fr.y==ey&&w[fr.x][fr.y]<=k)
        {
            printf("yes\n");
            return ;
        }
        for(int i=0;i<4;i++)
        {
            nt.x=fr.x+dx[i];
            nt.y=fr.y+dy[i];
            while(check(nt.x,nt.y))
            {
                if(s[nt.x][nt.y]==‘*‘)
                    break;
                if(w[nt.x][nt.y]<w[fr.x][fr.y]+1)
                    break;
                w[nt.x][nt.y]=w[fr.x][fr.y]+1;
                if(w[nt.x][nt.y]>k)
                    break;
                if(w[nt.x][nt.y]==k&&nt.x!=ex&&nt.y!=ey)
                    break;
                q.push(nt);
                nt.x+=dx[i];
                nt.y+=dy[i];
            }
        }
    }
    printf("no\n");
}
int main()
{
    scanf("%d",&tt);
    while(tt--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%s",s[i]);
        scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);
        sx--,sy--,ex--,ey--;
        bfs();
    }
    return 0;
}

  

(水搜索 hdu 1728)

标签:

原文地址:http://www.cnblogs.com/a972290869/p/4396895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!