题目大意: 给你一个地图,地图中只有两种元素,墙跟平地,然后要你求出一个人能在这个地图中走的最大距离。这个人一旦开始走路,那么他走的方向将是不变的。除非遇到墙,或者遇到地图的边,亦或者那个格子已经走过了,这个时候这个人才开始更换方向。然后要你求出这个人能走的最大距离的起始点的位置,输出最大距离,起始点坐标,还有一开始走的方向。(E,N,S,W),注意哦,如果最大距离相同,那么要输出起始点坐标的字典序最小的那个,比如(2,3)的字典序就小于(2,7)。还有,如果四个方向都能达到最大,那么选择的方向的优先级由(E,N,S,W)往下排列。 解题思路: 看了题目,感觉题意蛮好理解的。就是有点儿繁琐,要求的输出真是麻烦,神马字典序,还有最小方向。瞄了下时间,5000ms,那还等个啥,直接先暴力深搜看看吧,把每个点都作为起始点枚举一遍,找出最大值。在每个点的枚举过程中,先把那个四个方向要求最小的给处理掉,反正方向由(E,N,S,W)开始处理。遇到大一点的就覆盖,相等的就不处理。最后比较下最大距离相同的起始点的坐标的字典序就OK啦。 吐吐槽: 比赛的时候代码写的有点儿恶心,中途想错了下,就是那个人一走,只要不遇到那三个条件,他的方向会一直不变的。思路简单,不过能力有限,写出来的代码还是不怎么好看。
#include
const int MAX=625;
using namespace std;
typedef struct node
{
	int x,y;
}N;
typedef struct answer//记得只需要比较x,y字典序
{
	int dir;
	int x,y;
	int step;
}A;
A re_ans,ans;//开全局
char map[MAX][MAX];
int n,m,tal;//tal表示可以吃的路的长
bool visited[MAX][MAX];
int dir[4][2]={{0,1},{-1,0},{1,0},{0,-1}};//E,N,S,W
int flag;//标志一开始方向
int re_dir;//最终方向
//void DFS(int dir,int x,int y,int step)
//{
//	N cur;
//	cur.x=x;
//	cur.y=y;
//	visited[x][y]=true;
//	for(int i=0;i<4;i++)
//	{
//		if(step==1)
//		{
//			flag=i;
//			cout<<"这里是:"<=0 && cur.x=0 && cur.yans.step)//求最大
//		{
//			ans.step=step;
//			ans.dir=flag;
//		}
//	}
//}
void DFS(int dir1,int x,int y,int step)
{
	N cur;
	cur.x=x;
	cur.y=y;
	visited[cur.x][cur.y]=true;
	cur.x=x+dir[dir1][0];
	cur.y=y+dir[dir1][1];
	if(cur.x<0 || cur.x>=m || cur.y<0 || cur.y>=n 
		|| visited[cur.x][cur.y]==true || map[cur.x][cur.y]=='X')//遇到障碍
	{
		for(int i=0;i<=3;i++)
		{
			if(i==dir1)
				continue;
			cur.x=x+dir[i][0];
			cur.y=y+dir[i][1];
			if(cur.x>=0 && cur.x=0 && cur.yans.step)//求最大
			{
				ans.step=step;
				ans.dir=flag;
			}
		}
	}
	else
	{
		visited[cur.x][cur.y]=true;
		DFS(dir1,cur.x,cur.y,step+1);
		visited[cur.x][cur.y]=false;
	}
}
void init(int i,int j)
{
	memset(visited,false,sizeof(visited));
	ans.step=0;//这个作为中间最优
	flag=-1;//初始方向
	ans.x=i;
	ans.y=j;
}
void DFS_first(int x,int y,int step)
{
	N cur;
	cur.x=x;
	cur.y=y;
	visited[cur.x][cur.y]=true;
	for(int i=0;i<4;i++)
	{
		flag=i;
		cur.x=x+dir[i][0];
		cur.y=y+dir[i][1];
		if(map[cur.x][cur.y]=='.' && visited[cur.x][cur.y]==false
			&& cur.x>=0 && cur.x=0 && cur.y<=n)
		{
			visited[cur.x][cur.y]=true;
			DFS(flag,cur.x,cur.y,step+1);
			visited[cur.x][cur.y]=false;
			if(step>ans.step)//求最大
			{
				ans.step=step;
				ans.dir=flag;
			}
		}
	}
}
int main(void)
{
	int cas_c=1;
	while(scanf("%d%d",&m,&n),n||m)
	{
		re_ans.step=0;//这个最开始初始化
		for(int i=0;i<=m;i++)
			for(int j=0;j<=n;j++)
				map[i][j]='.';
		int num,i,j,x,y;
		scanf("%d",&num);
		//tal=m*n-num;
		for(i=0;ire_ans.step)
					{
						re_ans=ans;
					}
					else if(ans.step==re_ans.step)
					{
						if(ans.x
posted on 2011-12-04 12:34  cchun  阅读(199)  评论(0编辑  收藏  举报