深度优先搜索题:找到最长的路径,计算这样的路径有多少条(使用回溯)
分析题意可以得知,每次向前后左右走一步,直至走完16步就算一条走通路径。要求条件是不能超出4*4的范围,不能重复之前的路径。
①控制条件,若下一步已经被占有则返回
②控制条件,若下一步越界则返回
③控制条件,若下一步已到达末尾则返回,并且统计值+1
④若不在上述三个条件中则继续进行下一个点前后左右的试探,进去时需要将标记值设为1,出来后标记值为0
⑤主函数调用,将16个点每个都作为起点,调用回溯函数算出全部统计值
⑥输出统计值
代码如下👇
static int[] dx= {0,1,0,-1};
static int[] dy= {1,0,-1,0};
static int[][] arr=new int[4][4];
static int count=0;
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
snack(i, j, 0);
}
}
System.out.println(count);
}
//玩具蛇
public static void snack(int x,int y,int len) {
if (x>=4 || x<0 || y>=4 || y<0) {//先看有没有越界
return;
}
if (arr[x][y]==1) {//下一步已经被占有
return;
}
if (len>=15) {//走到结尾
count ++;
return;
}
for (int i = 0; i < 4; i++) {
arr[x][y]=1;
snack(x+dx[i], y+dy[i], len+1);
arr[x][y]=0;//回溯精精髓
}
}
运行结果