Bootstrap

蓝桥杯真题【玩具蛇】

蓝桥杯真题【玩具蛇】

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();
    }
}
;