蓝桥杯真题【玩具蛇】
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
/*
思路:
本题和路径之谜的题相似,也是dfs+回溯+剪枝:https://www.lanqiao.cn/problems/89/learning/
参照路径之谜的解法,以及相关题解:
https://blog.csdn.net/DratYu/article/details/115485220
可以得出本题的如下模板:
1、所需数据结构:
(1)一个二维数组存储格子标记路径是否访问过(1到n),相当于visit数组。
(2)两个数组分别存x和y坐标的方向坐标,用于引导路径自某点下左上右的移动。
(3)一个记录走过步数的变量step,用于终止条件的判断,也即记录了dfs向下走过多少层。
(4)一个记录有多个方案满足终止条件的变量ans。
2、代码结构:
记录总方案数的变量ans=0;
function dfs(x,y,step){
//当前状态 == 目的状态,即dfs截止条件
if(终止条件:step记录的步数达到了16){
记录总方案数的变量ans+1;
}
for((x,y)四个方向都试着走一遍){
用1、的(2)数组更新下一个方向(走下一步)的(x,y)坐标;
if(合法条件:如果下个格子未被访问,且下一步的(x,y)没有超出格子边界){
visit数组标记对下一步的格子(x,y)访问过;
对应下一步的格子(x,y)的靶数减1,用于控制路径朝向正确的方向;
dfs(下一步的(x,y)坐标,step+1) // 对下一步的格子继续四个方向的尝试
如果跳出了上面的dfs,说明不满足终止条件,那么此次尝试的方向不对,需要回溯,把visit数组对此方向下一步的格子(x,y)恢复访问状态;
}
}
}
*/
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
scan.close();
}
}