• HDU2782_暴力深搜_第十四周模拟赛


    题目大意: 给你一个地图,地图中只有两种元素,墙跟平地,然后要你求出一个人能在这个地图中走的最大距离。这个人一旦开始走路,那么他走的方向将是不变的。除非遇到墙,或者遇到地图的边,亦或者那个格子已经走过了,这个时候这个人才开始更换方向。然后要你求出这个人能走的最大距离的起始点的位置,输出最大距离,起始点坐标,还有一开始走的方向。(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
  • 相关阅读:
    java23中设计模式之策略模式
    java23中设计模式之模板模式
    java23中设计模式之备忘录模式
    java23中设计模式之命令模式
    java23中设计模式之中介者模式
    java23中设计模式之迭代器模式
    java23中设计模式只责任链模式
    web service -- jdk spring cxf ajax 开发(2)
    洛谷 P1566 加等式
    洛谷 P1439 【模板】最长公共子序列
  • 原文地址:https://www.cnblogs.com/cchun/p/2520201.html
Copyright © 2020-2023  润新知