POJ3083--Children of the Candy Corn

 BFS时忘记改变已经搜索的状态而陷入死循环,查了几天的错才找到。

主要是按方向搜索,看了zjydhr的代码,只要给出当前坐标和上次的方向,就可以计算出下一步走到哪儿,而且还不用回溯,其实就一个循环就完事了。

 

3083 Accepted 220K 0MS C++ 1263B 2009-11-20 21:30:14

 

#include<stdio.h>
#include<queue>
using namespace std;
int m,n,l,r,f,sx,sy,d[2][4]={1,0,-1,0,0,1,0,-1};//顺序按左边:下,右,上,左
char t[41][41];
struct node
{int x,y,d;}ct;
int bfs(int x,int y)
{queue<node> q;
node st={x,y,1};
q.push(st);
while(!q.empty())
	{int i,tx,ty;
	ct=q.front();
	q.pop();
	for(i=0;i<4;i++)
		{tx=ct.x+d[0][i];
		ty=ct.y+d[1][i];
		if(tx>=0&&ty>=0&&tx<n&&ty<m&&t[tx][ty]!='#')
			{if(t[tx][ty]=='E')
				return ct.d+1;
			node ad={tx,ty,ct.d+1};
			t[tx][ty]='#';//忘记这步陷入死循环
			q.push(ad);
			}
		}
	}
	return 0;
}
int dfs(int x,int y,int z)//z表示方向
{int i;
if(t[x][y]=='E')
	return 1;
for(i=0;i<4;i++)
	{int tx=x+d[0][z];
	int ty=y+d[1][z];
	if(t[tx][ty]=='.'||t[tx][ty]=='E')
		{
		if(f)//左搜
			{l++;
			if(z==3)
				z=-1;
			if(dfs(tx,ty,z+1))//方向加1,方向向左
				return 1;;
			}
		else//右搜
			{r++;
			if(!z)
				z=4;
			if(dfs(tx,ty,z-1))//方向减1,方向向右
				return 1;
			}
		}
	if(f)
		{z--;
		if(z==-1)
			z=3;
		}
	else
		{z++;
		if(z==4)
			z=0;
		}
	}
	return 0;
}
int main()
{int c,i,j;
scanf("%d",&c);
while(c--)
{scanf("%d%d",&m,&n);
for(i=0;i<n;i++	)
	{scanf("%s",t[i]);
	for(j=0;j<m;j++)
		if(t[i][j]=='S')
			{sx=i;
			sy=j;
			}
	}
	f=l=r=1;
	dfs(sx,sy,0);
	f=0;
	dfs(sx,sy,0);
	printf("%d %d %d/n",l,r,bfs(sx,sy));
}
}

 

你可能感兴趣的:(c,struct,ini)