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

poj 3083

2013年02月20日 ⁄ 综合 ⁄ 共 3036字 ⁄ 字号 评论关闭
#include<stdio.h>
#include<string.h>
char maze[42][42];
int s_l,s_r,e_l,e_r,w,h,s_f;
vist[42][42];
struct queue
{
  int line,row,depth;
}queue[1603];
int work_l()
{
	int i,j,l,r;
	l=s_l;
	r=s_r;
	j=s_f;	
	for(i=1;;i++)
	{
		if(r==e_r && l==e_l)
			break;
		
		if(j==0)
		{
			if(maze[l-1][r]=='.'){l--;j=3;continue;}
			else if(maze[l][r+1]=='.'){r++;continue;}
			else if(maze[l+1][r]=='.'){l++;j=1;continue;}
			else {r--;j=2;continue;}
		}
		else if(j==1)
		{
			if(maze[l][r+1]=='.'){r++;j=0;continue;}
			else if(maze[l+1][r]=='.'){l++;continue;}
			else if(maze[l][r-1]=='.'){r--;j=2;continue;}
			else {l--;j=3;continue;}
		}
		else if(j==2)
		{
			if(maze[l+1][r]=='.'){l++;j=1;continue;}
			else if(maze[l][r-1]=='.'){r--;continue;}
			else if(maze[l-1][r]=='.'){l--;j=3;continue;}
			else {r++;j=0;continue;}
		}
		else
		{
			if(maze[l][r-1]=='.'){r--;j=2;continue;}
			else if(maze[l-1][r]=='.'){l--;continue;}
			else if(maze[l][r+1]=='.'){r++;j=0;continue;}
			else {l++;j=1;continue;}
		}
	}
	return i;
}

int work_r()
{
	int i,j,l,r;
	l=s_l;
	r=s_r;
	j=s_f;
	
	for(i=1;;i++)
	{
		if(r==e_r && l==e_l)
			break;
		
		if(j==0)
		{
			if(maze[l+1][r]=='.'){l++;j=1;continue;}			
			else if(maze[l][r+1]=='.'){r++;continue;}
			else if(maze[l-1][r]=='.'){l--;j=3;continue;}
			else {r--;j=2;continue;}
		}
		else if(j==1)
		{
			if(maze[l][r-1]=='.'){r--;j=2;continue;}			
			else if(maze[l+1][r]=='.'){l++;continue;}
			else if(maze[l][r+1]=='.'){r++;j=0;continue;}
			else {l--;j=3;continue;}
		}
		else if(j==2)
		{
			if(maze[l-1][r]=='.'){l--;j=3;continue;}		
			else if(maze[l][r-1]=='.'){r--;continue;}
			else if(maze[l+1][r]=='.'){l++;j=1;continue;}
			else {r++;j=0;continue;}
		}
		else
		{
			if(maze[l][r+1]=='.'){r++;j=0;continue;}			
			else if(maze[l-1][r]=='.'){l--;continue;}
			else if(maze[l][r-1]=='.'){r--;j=2;continue;}
			else {l++;j=1;continue;}
		}
	}
	return i;
}

int BFS()
{
	int tail=1,head=1,r,l,i=1;
	l=s_l;r=s_r;
	queue[1].line=s_l;
	queue[1].row=s_r;
	queue[1].depth=1;
	memset(vist,0,sizeof(vist));
	//vist[queue[1].line][queue[1].row]=1;
	while(head<=tail)
	{
		//	i++;
		//if(vist[queue[head].line][queue[head].row]!=1)//我在这条语句快疯掉了,加了这条语句就tle,TMD~~
	//	{												//不加就0ms~~~
			if(queue[head].line==e_l && queue[head].row==e_r)//准确来说是一入队列就将vist标记为1(这是对的),还是出队时才标记1(这是错的)
				return queue[head].depth;
			
			//vist[queue[head].line][queue[head].row]=1;
			l=queue[head].line;r=queue[head++].row;
			if(vist[l][r-1]==0 && maze[l][r-1]=='.'){queue[++tail].line=l;vist[l][r-1]=1;queue[tail].row=r-1;queue[tail].depth=queue[head-1].depth+1;}
			if(vist[l-1][r]==0 && maze[l-1][r]=='.'){queue[++tail].line=l-1;vist[l-1][r]=1;queue[tail].row=r;queue[tail].depth=queue[head-1].depth+1;}
			if(vist[l][r+1]==0 && maze[l][r+1]=='.'){queue[++tail].line=l;vist[l][r+1]=1;queue[tail].row=r+1;queue[tail].depth=queue[head-1].depth+1;}
			if(vist[l+1][r]==0 && maze[l+1][r]=='.'){queue[++tail].line=l+1;vist[l+1][r]=1;queue[tail].row=r;queue[tail].depth=queue[head-1].depth+1;}
	//	}
	}
}

int main()
{
	int T;
	int i,j;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&w,&h);
		//	memset(maze,'\0',sizeof(maze));
		for(i=1;i<=h;i++)
		{
			getchar();
			for(j=1;j<=w;j++)
			{
				scanf("%c",&maze[i][j]);
				if(maze[i][j]=='S')
				{
					s_l=i;
					s_r=j;
					maze[i][j]='.';
				}
				else if(maze[i][j]=='E')
				{
					e_l=i;
					e_r=j;
					maze[i][j]='.';
				}
			}
			
			
		}
		if(s_l==1)
			s_f=1;
		else if(s_r==1)
			s_f=0;
		else if(s_l==h)
			s_f=3;
		else
			s_f=2;
		
		printf("%d %d %d\n",work_l(),work_r(),BFS());
	}
	return 0;
}

这道只是很简单的BFS搜索题,但是我却被困了一天一夜,TMD,唉,还是练得不够哦~~

抱歉!评论已关闭.