import java.util.LinkedList; public class SenvenB { public static LinkedList<Integer> path = new LinkedList<>(); public static int[][] map; public static int count = 0; public static void f(int[][] m,int i,int j){//进行连通性检测 m[i][j] = 0; if(i > 0 && m[i-1][j] == 1){ f(m,i-1,j); } if(j > 0 && m[i][j-1] == 1){ f(m,i,j-1); } if(i+1<m.length && m[i+1][j] == 1){ f(m,i+1,j); } if(j+1<m[0].length && m[i][j+1] == 1){ f(m,i,j+1); } } public static boolean IsMap(){//创造数组 int[][] m = new int[3][4]; int num = 1; for(int i = 0;i < 3;i++){ for(int j = 0;j < 4;j++){ if(path.contains(num)){ m[i][j] = 1; } num++; } } int ans = 0; for(int i = 0;i < 3;i++){ for(int j = 0;j < 4;j++){ if(m[i][j] == 1){ f(m,i,j); ans++; } } } return ans == 1; } public static void dfs(int index){//进行全排列处理 if(path.size() == 5){ if(IsMap()){ count++; } return; } for(int i = index;i <= 12;i++){ if(path.contains(i)){ continue; } path.add(i); dfs(i+1); path.removeLast(); } } public static void main(String[] args){ map = new int[3][4]; int num = 1; for(int i = 0;i < map.length;i++){ for(int j = 0;j < map[0].length;j++){ map[i][j] = num++; } } dfs(1); System.out.println(count); } }
这个题目不能进行深搜处理,会出现T字形的邮票无法被选出来。所以反而使用暴力递归处理,进行12个数字组合,再来判断该数据是否可行才可能做出来。深搜的话一下就掉进了死胡同,很难去处理。