hdu 1728(广搜)

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;
}

 

你可能感兴趣的:(hdu 1728(广搜))