HDU 1728 逃离迷宫

这个题伤到我了!!!!搞了我好久才把他给弄出来;这里采取的方法是当选取一个方向是就一直走到底,如果没有到终点,那么一定会要转弯;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int inf=0x7fffffff;
struct T
{
int x,y;
int turn;
}q[100024];
int d[4][2]={0,1,1,0,0,-1,-1,0};
int hash[124][124],n,m,x1,x2,y1,y2,k;
char map[124][124];
void init( )
{
memset( map,0,sizeof( map ) );
memset( hash,0,sizeof( hash ) );
}
int push_stack( int x,int y,int T_turn,int end )
{
T t;
t.x=x;t.y=y;
t.turn=T_turn;
q[end++]=t;
return end;
}
bool BFS( )
{
int first=0,end=0;
end=push_stack( x1,y1,-1,end );
hash[x1][y1]=1;
while( first<end )
{
int T_turn=q[first].turn+1;
if( T_turn>k )
return false;
for( int i=0;i<4;i++ )
{
int dx=q[first].x+d[i][0];
int dy=q[first].y+d[i][1];

while( map[dx][dy]=='.' )//4个方向一直走到底,如果没有到终点则一定要转弯。
{
if( dx==x2&&dy==y2 )
return true;
if( !hash[dx][dy] )//标记走过的,但对直线搜查的时候没影响,但又保证不入队。
{
end=push_stack( dx,dy,T_turn,end );
hash[dx][dy]=1;
}
dx+=d[i][0];
dy+=d[i][1];
}
}
first++;
}
return false;
}
int main()
{
int T;
scanf( "%d",&T );
while( T-- )
{
scanf( "%d%d",&n,&m );
init( );
for( int i=1;i<=n;i++ )
scanf( "%s",map[i]+1 );
scanf( "%d%d%d%d%d",&k,&y1,&x1,&y2,&x2 );
if( x1==x2&&y1==y2 )
{
printf( "yes\n" );
}
else
{
if( BFS( ) )
printf( "yes\n" );
else printf( "no\n" );
}
}
return 0;
}

 

转载于:https://www.cnblogs.com/bo-tao/archive/2011/11/19/2255399.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值