答案:116
import java.util.ArrayList;
import java.util.List;
public class JianYouPiao{
static int res = 0;
static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
backtracking(nums, 0);
System.out.println(res);
}
public static void backtracking(int[] nums, int startIndex) {
if (list.size() == 5) {
if(isValid(list)){//5个点被标记,判断其连通性,只能有一个连通块
System.out.println(list);
res++;
}
return;
}
for (int i = startIndex; i < nums.length; i++) {
list.add(nums[i]);
backtracking(nums, i + 1);
list.remove(list.size() - 1);
}
}
public static boolean isValid(List<Integer> list){//5个点被标记,判断其连通性,要求只有一个连通块
int[][] map = new int[3][4];
for(int i = 0; i < list.size(); i++){//把五个被标记的点记录到二维数组上
int num = list.get(i);
map[(num - 1) / 4][(num - 1) % 4] = 1;
}
int ans = 0;//记录连通块的数目
for(int i = 0; i < 3; i++){
for(int j = 0; j < 4; j++){
if(map[i][j] == 1){
dfs(map, i, j);
ans++;
}
}
}
return ans == 1;
}
public static void dfs(int[][] map, int i, int j){
map[i][j] = 0;
int m = map.length, n = map[0].length;//m行n列
if(i - 1 >= 0 && map[i - 1][j] == 1){
dfs(map, i - 1, j);
}
if(i + 1 < m && map[i + 1][j] == 1){
dfs(map, i + 1, j);
}
if(j - 1 >= 0 && map[i][j - 1] == 1){
dfs(map, i, j - 1);
}
if(j + 1 < n && map[i][j + 1] == 1){
dfs(map, i, j + 1);
}
}
}