现在的位置: 首页 > 综合 > 正文

hdu1728

2014年01月16日 ⁄ 综合 ⁄ 共 1114字 ⁄ 字号 评论关闭

/*
分析:
    沿着一条直线一直走,把该直线上的所有点,当作
零消费的点。

                                             2012-07-24
*/

#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;


struct node
{
	int x,y;
	int ts;
};
int map[111][111];
int n,m;
int x_s,y_s;
int x_e,y_e;
int limit;
int dir[4][2]={1,0, -1,0, 0,1, 0,-1};


int judge(int x,int y)
{
	if(x<0 || x>=n || y<0 || y>=m)	return -1;
	return map[x][y];
}
int BFS()
{
	queue<node>q;
	node cur,next;
	int i;
	int temp;


	cur.x=x_s;
	cur.y=y_s;
	cur.ts=-1;
	map[cur.x][cur.y]=-1;
	q.push(cur);


	while(!q.empty())
	{
		cur=q.front();
		q.pop();
		if(cur.ts>limit)				return -1;
		if(cur.x==x_e && cur.y==y_e)	return 1;
		for(i=0;i<4;i++)
		{
			next.x=cur.x+dir[i][0];
			next.y=cur.y+dir[i][1];
			temp=judge(next.x,next.y);
			while(temp!=-1)
			{
				if(temp==0)
				{
					next.ts=map[next.x][next.y]=cur.ts+1;
					q.push(next);
				}
				next.x+=dir[i][0];
				next.y+=dir[i][1];
				temp=judge(next.x,next.y);
			}
		}
	}
	return -1;
}


int main()
{
	int T;
	char str[111];
	int i,l;
	int ans;


	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(i=0;i<n;i++)
		{
			scanf("%s",str);
			for(l=0;str[l];l++)
			{
				if(str[l]=='.')		map[i][l]=0;
				else if(str[l]=='*')map[i][l]=-1;
			}
		}
		scanf("%d%d%d%d%d",&limit,&y_s,&x_s,&y_e,&x_e);
		x_s--;y_s--;
		x_e--;y_e--;


		ans=BFS();
		if(ans==-1)	printf("no\n");
		else		printf("yes\n");
	}
	return 0;
}

抱歉!评论已关闭.