1. 程式人生 > >POJ 3083 Children of the Candy Corn

POJ 3083 Children of the Candy Corn

如下程式碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define MAXN 110 
#define N 21
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dr[4][2]={{0,1},{-1,0,},{0,-1},{1,0}};
int sx,sy,ex,ey,n,m;
char G[MAXN][MAXN];
using namespace std;
struct Node
{
	int x,y,s;	
};
int DFS(int x,int y,int d,int step,int dir[][2])
{
	for(int i=0;i<=3;i++)
	{
		int j=((d-1+4)%4+i)%4;
		int nx=x+dir[j][0];
		int ny=y+dir[j][1];
		if(nx==ex&&ny==ey)
			return step+1;
		if(nx<0||ny<0||nx>=n||ny>=m)
			continue;
		if(G[nx][ny]=='#')
			continue;
		return DFS(nx,ny,j,step+1,dir);
	}	
}
int BFS(int sx,int sy)
{
	bool v[MAXN][MAXN];
	memset(v,false,sizeof(v));
	queue<Node>Q;
	Node p;
	p.x=sx;
	p.y=sy;
	p.s=1;
	Q.push(p);
	v[sx][sy]=true;
	while(!Q.empty())
	{
		Node p=Q.front();
		Q.pop();
		if(p.x==ex&&p.y==ey)
			return p.s;
		Node np;	
		for(int d=0;d<=3;d++)
		{
			np.x=p.x+dx[d];
			np.y=p.y+dy[d];
			np.s=p.s+1;
			if(np.x<0||np.y<0||np.x>=n||np.y>=m)	
				continue;
			if(v[np.x][np.y])
				continue;
			if(G[np.x][np.y]!='#')
			{
				v[np.x][np.y]=true;
				Q.push(np);	
			}
		}
	}
	return -1;	
}
int main()
{
	int T,d1,d2;
	scanf("%d",&T);
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		for(int i=0;i<n;i++)
		{	
			scanf("%s",G[i]);
			for(int j=0;j<m;j++)
			{
				if(G[i][j]=='S')
				{
					sx=i;
					sy=j;
				}
				else if(G[i][j]=='E')
				{
					ex=i;
					ey=j;	
				}		
			}	
		}
		if(sx==0)
		{
			d1=3,d2=3;	
		}
		else if(sx==n-1)
		{
			d1=1;
			d2=1;	
		}
		else if(sy==0)
		{
			d1=2;
			d2=0;	
		}
		else if(sy==m-1)
		{
			d1=0;
			d2=2;	
		}
		cout<<DFS(sx,sy,d1,1,dl)<<' '<<DFS(sx,sy,d2,1,dr)<<' '<<BFS(sx,sy)<<endl;	
	}	
	//while(1);
	return 0;
}