题目
小蓝有一条玩具蛇,一共有 1616 节,上面标着数字 11 至 1616。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 9090 度角。
小蓝还有一个 4 × 44×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 AA 到 PP 共 1616 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。
思路
dfs暴力搜,枚举每一个位置为开头
代码
import java.util.*;
public class Main {
// (x,y)
static int[][] upDownLeftRight = {
{
-1,0},{
1,0},{
0,-1},{
0,1}};
static int count = 0;
public static void dfs(int[][] arr, int x, int y, int num) {
if (num == 15) {
count++;
return;
}
for (int i = 0; i < 4; i++) {
int newX = x + upDownLeftRight[i][0];
int newY = y + upDownLeftRight[i][1];
if (newX < 0 || newX >= 4 || newY < 0 || newY >= 4 || arr[newX][newY] == 1) {
continue;
}
arr[newX][newY] = 1;
dfs(arr, newX, newY, num+1);
arr[newX][newY] = 0;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] arr = new int[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
// 起点也要标记
arr[i][j] = 1;
dfs(arr, i, j,0);
arr[i][j] = 0;
}
}
System.out.println(count);
}
}
运行结果
552