hdu 1728(广搜)

本文介绍了一个使用广度优先搜索(BFS)算法解决迷宫寻路问题的C++实现。通过定义结构体来表示迷宫中的点,并利用队列进行节点扩展,实现了从起点到终点不超过指定拐弯次数的路径寻找。文章提供了完整的代码实现。

http://acm.hdu.edu.cn/showproblem.php?pid=1728

方法应该没问题,错误找不出来。。彻底败在测试上了。

 

code:

#include <stdio.h>
#include "iostream.h"
#include "queue.h"
#include "memory.h"
char map[105][105];
int vit[105][105];
int fangxiang[4][2]={0,1,0,-1,1,0,-1,0};
int m,n;
int k,bgx,bgy,endx,endy;		//拐弯数,起点坐标和终点坐标

int flag;				//标记是否到达 
struct point			//结构体点 
{
	int x;
	int y;
	int turns;
	int toward;
};
queue <point> q;

int cango(int x,int y)		//判断是否是有效扩展点 
{
	if(x>=1&&x<=m&&y>=1&&y<=n&&!vit[x][y]&&map[x][y]=='.')
	{
		return 1;
	}
	return 0;
}
void bfs()		//开始广搜 
{
	while(!q.empty())	//队列不为空 
	{
		point now;
		now=q.front();
		q.pop();
		if(now.x==endx&&now.y==endy&&now.turns<=k&&map[endx][endy]=='.')	//找到答案 
		{
			flag=1;
			return ;
		}
		if(now.turns>k)			//各种剪枝 
		{
			continue;
		}
		if(flag==1)
		{
			return ;
		}
		if(now.turns==k&&now.x-endx!=0&&now.y-endy!=0)
		{
			continue;
		}
		int newx,newy,newturns,newtoward;
		int i;
		for(i=0;i<4;i++)				//四个方向扩展 
		{
			newx=now.x+fangxiang[i][0];
			newy=now.y+fangxiang[i][1];
			if(cango(newx,newy))		//是有效扩展点 
			{
				vit[newx][newy]=1;
				if(now.toward==-1)		//为起始点		 
				{
					newtoward=i;
					newturns=now.turns;
				}else if(now.toward==i)	//不用拐弯 
				{
					newtoward=i;
					newturns=now.turns;
				}else if(now.toward!=i)	//需要拐弯 
				{
					newtoward=i;
					newturns=now.turns+1;
				}
				
				point next;
				next.x=newx;
				next.y=newy;
				next.turns=newturns;
				next.toward=newtoward;
				q.push(next);
			}
		}
	}
}
using namespace std;
int main(int argc, char *argv[])
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		while(!q.empty())	//队列清空 
		{
			q.pop();
		}
		memset(vit,0,sizeof(vit));	//访问清空 
		scanf("%d%d",&m,&n);
		int i,j;
		for(i=1;i<=m;i++)
		{
			for(j=1;j<=n;j++)
			{
				cin>>map[i][j];		//输入图的信息 
			}
		}
		
		scanf("%d%d%d%d%d",&k,&bgy,&bgx,&endy,&endx);	//输入拐弯数起点终点坐标 
		if(map[bgx][bgy]!='.'||map[endx][endy]!='.')
		{
			printf("no\n");
		}else
		{
			point start;
			start.x=bgx;
			start.y=bgy;
			start.toward=-1;
			start.turns=0;
			vit[bgx][bgy]=1;
			q.push(start);
			flag=0;
			bfs();
			if(flag==1)
			{
				printf("yes\n");
			}else
			{
				printf("no\n");
			}
		}
	}
	return 0;
}

 

转载于:https://my.oschina.net/hlslml77/blog/176969

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值