DFS贪吃蛇
DFS模板:
1.明确返回条件:什么时候返回,结束此次DFS;
2.DFS思路,也就是递归思路;
3.不要忘记一些额外的逻辑:比如说走过的路就不走了;
package DP.dfs;
/**
* @author diao 2022/2/26
*/
public class 贪吃蛇问题 {
static int sum=0;//方法数
static int number=0;//步数
static int[][] array = new int[4][4];//定义一个二维数组
public static void main(String[] args) {
//因为只要位置不一样就不同种,暴力枚举所有位置
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
//从左上角开始枚举
sum+= dfs(i,j,array,0);
}
}
System.out.println(sum);
}
public static int dfs(int right,int left,int array[][],int number){
/*
Dfs流程:1.先写返回条件以及后果
2.然后开始写递归思路即可
* */
//出界情况
if(right<0||left<0||right>3||left>3){
return 0;
}
//当位置已经被占用时:比如说当你已经走到了墙壁那里,那么在墙壁之前你走的路就已经存在你的状态了
//所以说当你一直朝右边走发现走不了往回走时会直接返回,因为已经存在状态了
if(array[right][left]==1){
return 0;
}
//当放满玩具蛇时
if(number>=15){
return 1;
}
//递归的一些逻辑,当为1代表改位置占用
array[right][left]=1;
int sum1=0;
//下面开始递归
sum1=dfs(right+1,left,array,number+1)+dfs(right-1,left,array,number+1)
+dfs(right,left+1,array,number+1)+dfs(right,left-1,array,number+1);
//一个位置递归完后记得置空,这时候置空的话就是那个大范围的置空(相当于根节点)
array[right][left]=0;
return sum1;
}
}