OJ常用技巧

梦想的初衷 提交于 2020-02-05 03:46:54

OJ常用技巧

0.前言

本文章主要积累一些编程中常用的骗分技巧。可能是针对某些特殊的样例才有用,但是也有一定的道理,可能会给大家带来一些新的启示。

1.dfs常用技巧

1.1 适当剪枝

这个不说

1.2 添加返回条件

比如说一个程序只有达到某种条件时才会返回,但是因为条件太少,返回不多,就容易出现DFS爆栈的情况,所以需要增加条件。通常情况下,可以用增加阈值的情况来限制深搜的步骤。比如说:马的遍历 这道题,(很明显,这是一道BFS的题,但是如果真的要用dfs写的话,就很容易出现超时。)
比如我用如下的代码交这道题的时候,就有一个测试点超时。【如下图所示】
在这里插入图片描述
这时候如果真想用dfs交题就可以尝试添加一个dfs的返回条件。代码如下:

//count 代表马儿走了多少步
//(x,y) 代表当前的坐标值 
void dfs(int x,int y ,int count){
	if(x>n || x<1 || y<1 || y>m )//如果越界了 
		return ;
	if(cur > 200)
		return;
	//肯定小,直接赋值 
	f[x][y] = count;		
	
	if(count+1 < f[x-2][y+1]) dfs(x-2,y+1,count+1);//1 往右上
	if(count+1 < f[x-1][y+2]) dfs(x-1,y+2,count+1);//2  
	if(count+1 < f[x+1][y+2]) dfs(x+1,y+2,count+1);//3	
	if(count+1 < f[x+2][y+1]) dfs(x+2,y+1,count+1);//4往右下	 
	if(count+1 < f[x+2][y-1]) dfs(x+2,y-1,count+1);//5
	if(count+1 < f[x+1][y-2]) dfs(x+1,y-2,count+1);//6
	if(count+1 < f[x-1][y-2]) dfs(x-1,y-2,count+1);//7
	if(count+1 < f[x-2][y-1]) dfs(x-2,y-1,count+1);//8往左上  	
} 

其中的关键语句就是

	if(cur > 200)
		return;

添加完之后就可以AC了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!