hdu 1728(续)

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

参考网上大神的代码后,修改了vit数组的用法后就没问题了。。。又学到新东西了

代码似乎不用写得这么长,以后再碰到类似的题再做下更进吧、

vit[max][max]        //保存最小拐弯次数

http://blog.csdn.net/w00w12l/article/details/7858630

code:

 

#include <stdio.h>
#include "iostream.h"
#include "queue.h"
#include "memory.h"
#define INF 1000000
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&&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;
					if(vit[newx][newy]>=newturns)	//当前拐弯数小于保存在vit的拐弯数,也算是减枝中的一种吧! 
					{
						vit[newx][newy]=newturns;
						point next;
						next.x=newx;
						next.y=newy;
						next.turns=newturns;
						next.toward=newtoward;
						q.push(next);
					}
				}else if(now.toward==i)	//不用拐弯 
				{
					newtoward=i;
					newturns=now.turns;
					if(vit[newx][newy]>=newturns)	//当前拐弯数小于保存在vit的拐弯数
					{
						vit[newx][newy]=newturns;
						point next;
						next.x=newx;
						next.y=newy;
						next.turns=newturns;
						next.toward=newtoward;
						q.push(next);
					}
				}else if(now.toward!=i)	//需要拐弯 
				{
					newtoward=i;
					newturns=now.turns+1;
					if(vit[newx][newy]>=newturns){  	//当前拐弯数小于保存在vit的拐弯数
     					vit[newx][newy]=newturns; 
				 		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));	//访问清空 
		memset(map,'\0',sizeof(map));
		scanf("%d%d",&m,&n);
		int i,j;
		for(i=1;i<=m;i++)
		{
			for(j=1;j<=n;j++)
			{
				cin>>map[i][j];		//输入图的信息 
			}
		}
		for(i=1;i<=m;i++)			//访问量初始化最大 
		{
			for(j=1;j<=n;j++)
			{
				vit[i][j]=INF;
			}
		}
		
		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]=0;
			q.push(start);
			flag=0;
			bfs();
			if(flag==1)
			{
				printf("yes\n");
			}else
			{
				printf("no\n");
			}
		}
	}
	return 0;
}

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