E - Children of the Candy Corn -DFS模拟+bfs



#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
char map[45][45];  
char map2[45][45];   
int n,m;
int dir1_left[][2]={1,0,0,-1,-1,0};
int dir2_left[][2]={0,-1,-1,0,0,1};
int dir3_left[][2]={-1,0,0,1,1,0};
int dir4_left[][2]={0,1,1,0,0,-1};

int dir1_r[][2]={-1,0,0,-1,1,0};
int dir2_r[][2]={0,1,-1,0,0,-1};
int dir3_r[][2]={1,0,0,1,-1,0};
int dir4_r[][2]={0,-1,1,0,0,1};

int dir[][2]={0,1,0,-1,1,0,-1,0};
int pace_l;
int pace_r;
int flag;
int pace;

int legal(int x,int y)
{
	if (x>=1&&y>=1&&x<=n&&y<=m)
		return 1;
	return 0;
}
struct node
{
	int x,y;
	int time; 
};
	queue <node> qq;

int	bfs(int x,int y)
{
		node tmp;
	while(!qq.empty())
	{
		tmp=qq.front();
		qq.pop();
		
		
		int i;
		for (i=0;i<4;i++)
		{
			int r=tmp.x+dir[i][0];
			int c=tmp.y+dir[i][1];
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				node tt=tmp;
				tt.x=r;
				tt.y=c;
				tt.time++;
				if (map[r][c]=='E')
				{
					pace=tt.time;
					return 0;
						
				}
				
				map[r][c]='#';
				qq.push(tt);
			}
			
		}
	}
	
}


int dfs_l(int x,int y,int posi)
{ 
	
	int i;
	if (map[x][y]=='E')
	{
		pace_l=pace;
		flag=1;
		return 0;
	}
	if (posi==1)
	{
		for (i=0;i<3;i++)
		{
			int r=x+dir1_left[i][0];
			int c=y+dir1_left[i][1];
			
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				//  if (map[r][c]=='.')	map[r][c]='#';
				int pposi;
				if (i==0) pposi=4;
				if (i==1) pposi=1;
				if (i==2) pposi=2;
				pace++;
				dfs_l(r,c,pposi);
				pace++;
				if (flag==1)
					return 0;
				map[r][c]='.';
			}
		}
		
		
	}
	if (posi==2)
	{
		for (i=0;i<3;i++)
		{
			int r=x+dir2_left[i][0];
			int c=y+dir2_left[i][1];
			
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				//  if (map[r][c]=='.')	map[r][c]='#';
				int pposi;
				if (i==0) pposi=1;
				if (i==1) pposi=2;
				if (i==2) pposi=3;
				pace++;
				dfs_l(r,c,pposi);
				pace++;
				if (flag==1)
					return 0;
				map[r][c]='.';
			}
		}
		
		
	}
	if (posi==3)
	{
		for (i=0;i<3;i++)
		{
			int r=x+dir3_left[i][0];
			int c=y+dir3_left[i][1];
			
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				//  if (map[r][c]=='.')	map[r][c]='#';
				int pposi;
				if (i==0) pposi=2;
				if (i==1) pposi=3;
				if (i==2) pposi=4;
				pace++;
				dfs_l(r,c,pposi);
				pace++;
				if (flag==1)
					return 0;
				map[r][c]='.';
			}
		}
		
		
	}
				if (posi==4)
				{
					for (i=0;i<3;i++)
					{
						int r=x+dir4_left[i][0];
						int c=y+dir4_left[i][1];
						
						if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
						{
							//  if (map[r][c]=='.')	map[r][c]='#';
							int pposi;
							if (i==0) pposi=3;
							if (i==1) pposi=4;
							if (i==2) pposi=1;
							pace++;
							dfs_l(r,c,pposi);
							pace++;
							if (flag==1)
								return 0;
							map[r][c]='.';
						}
					}
					
					
				} 
				
				
				return 0;
}

int dfs_r(int x,int y,int posi)
{ 
	
	int i;
	if (map[x][y]=='E')
	{
		pace_r=pace;
		flag=1;
		return 0;
	}
	if (posi==1)
	{
		for (i=0;i<3;i++)
		{
			int r=x+dir1_r[i][0];
			int c=y+dir1_r[i][1];
			
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				//  if (map[r][c]=='.')	map[r][c]='#';
				int pposi;
				if (i==0) pposi=2;
				if (i==1) pposi=1;
				if (i==2) pposi=4;
				pace++;
				dfs_r(r,c,pposi);
				pace++;
				if (flag==1)
					return 0;
				map[r][c]='.';
			}
		}
		
		
	}
	if (posi==2)
	{
		for (i=0;i<3;i++)
		{
			int r=x+dir2_r[i][0];
			int c=y+dir2_r[i][1];
			
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				//  if (map[r][c]=='.')	map[r][c]='#';
				int pposi;
				if (i==0) pposi=3;
				if (i==1) pposi=2;
				if (i==2) pposi=1;
				pace++;
				dfs_r(r,c,pposi);
				pace++;
				if (flag==1)
					return 0;
				map[r][c]='.';
			}
		}
		
		
	}
	if (posi==3)
	{
		for (i=0;i<3;i++)
		{
			int r=x+dir3_r[i][0];
			int c=y+dir3_r[i][1];
			
			if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
			{
				//  if (map[r][c]=='.')	map[r][c]='#';
				int pposi;
				if (i==0) pposi=4;
				if (i==1) pposi=3;
				if (i==2) pposi=2;
				pace++;
				dfs_r(r,c,pposi);
				pace++;
				if (flag==1)
					return 0;
				map[r][c]='.';
			}
		}
		
		
	}
				if (posi==4)
				{
					for (i=0;i<3;i++)
					{
						int r=x+dir4_r[i][0];
						int c=y+dir4_r[i][1];
						
						if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E'))
						{
							//  if (map[r][c]=='.')	map[r][c]='#';
							int pposi;
							if (i==0) pposi=1;
							if (i==1) pposi=4;
							if (i==2) pposi=3;
							pace++;
							dfs_r(r,c,pposi);
							pace++;
							if (flag==1)
								return 0;
							map[r][c]='.';
						}
					}
					
					
				} 
				
				
				return 0;
}

int main()

{
	int i,j;
	int t;
	cin>>t;
	while(t--)
	{
		memset(map,0,sizeof(map)); 
		int sx,sy;
		cin>>m>>n;
		getchar();
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=m;j++)
			{
				scanf("%c",&map[i][j]);
				map2[i][j]=map[i][j];
				if (map[i][j]=='S')
				{
					sx=i;
					sy=j;
				}
					
			}
			getchar();
		}
		
		int posi;
		if (legal(sx+1,sy)&&map[sx+1][sy]=='.')
			posi=4;
		if (legal(sx,sy+1)&&map[sx][sy+1]=='.')
			posi=3;
		if (legal(sx-1,sy)&&map[sx-1][sy]=='.')
			posi=2;
		if (legal(sx,sy-1)&&map[sx][sy-1]=='.')
			posi=1;
		
		
		flag=0;
		pace=1;
	 	dfs_l(sx,sy,posi);
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=m;j++)
			{
				map[i][j]=map2[i][j];
			}
		}
		flag=0;
		pace=1;
 		dfs_r(sx,sy,posi);
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=m;j++)
			{
				map[i][j]=map2[i][j];
			}
		}
			pace=1;


	while(!qq.empty())
		qq.pop();

	node tmp;
	tmp.x=sx;
	tmp.y=sy;
	tmp.time=1;
	qq.push(tmp);
		bfs(sx,sy);

		printf("%d %d %d\n",pace_l,pace_r,pace);
		
		
		
		
		
	}
	return 0;
}


你可能感兴趣的:(E - Children of the Candy Corn -DFS模拟+bfs)