hdu 1728 逃离迷宫

传送门

这个题我是用bfs写,想法是把他每一次转弯后可以走到的点都入队(不用再次转弯就可以到的点)

然后看每个点能不能再次转弯,可以的话就再次转弯记下直线上的点,一直到找到这个点或者转弯次数用完。

还有题目的行和列与平常是不一样的 有点坑

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int x,y,step;
};
int n,m,k,ex,ey,sx,sy,vis[105][105];
char a[105][105];
int x[]= {1,-1,0,0};
int y[]= {0,0,1,-1};//方向 
int  bfs()
{
	node w;
	w.step=-1;
	w.x=sx;
	w.y=sy;
	memset(vis,0,sizeof(vis));
	vis[sx][sy]=1;//初始化 
	queue<node>q;
	q.push(w);//入队 
	node f,e;
	while(!q.empty())
	{
		f=q.front();
		q.pop();//出队第一个 
		if(f.x==ex&&f.y==ey&&f.step<=k)
			return 1;//满足条件就结束(即找到了末尾的点) 返回一个1  
		e.step=f.step+1;//(转向加一) 
		for(int i=0; i<4; i++)//往四个方向转 
		{
			int xx=f.x+x[i];
			int yy=f.y+y[i]; 
			while(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!='*')//不超边界 不碰到‘*’ 那么这一条线都可以直接到 
			{
				if(vis[xx][yy]==0)//没用过 
				{
					vis[xx][yy]=1;
					e.x=xx;
					e.y=yy;
					q.push(e);//入栈 
				}
				xx+=x[i];
				yy+=y[i];//不转弯的下一个点 
			}
		}
	}
	return 0;//最后没找到末尾的点 返回一个0 
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1; i<=n; i++)
			for(int j=1; j<=m; j++)
				cin>>a[i][j];
		cin>>k>>sy>>sx>>ey>>ex;
		if(bfs()) cout<<"yes"<<endl;
		else cout<<"no"<<endl;
	}
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值