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了。
来源:CSDN
作者:Lawson_6
链接:https://blog.csdn.net/liu16659/article/details/104174646