蓝桥杯 2016年 第七届 剪邮票(JAVA)

蓝桥杯 2016年 第七届 剪邮票(JAVA)


package provincial_2016B;

public class Seven_case2 {
	private static final int TOTAL=12;
	private static int[] comb={0,0,0,0,0,0,0,1,1,1,1,1};
	private static int[] vis=new int[TOTAL];
	private static int[][] map=new int[3][4];
	private static int ans;
	
	public static void dfs(int i,int j){
		map[i][j]=0;
		if(i-1>=0&&map[i-1][j]==1)dfs(i-1, j);
		if(i+1<3&&map[i+1][j]==1)dfs(i+1, j);
		if(j-1>=0&&map[i][j-1]==1)dfs(i, j-1);
		if(j+1<4&&map[i][j+1]==1)dfs(i, j+1);
	}
	
	public static void check(int[] path){
		// 在12个数字中选择5个
		for(int i=0;i<3;i++){
			for(int j=0;j<4;j++){
				if(path[i*4+j]==1) map[i][j]=1;
				else map[i][j]=0;
			}
		}
		// 检测连通性
		int cnt=0;
		for(int i=0;i<3;i++){
			for(int j=0;j<4;j++){
				if(map[i][j]==1){
					dfs(i,j);
					cnt++;
				}
			}
		}
		if(cnt==1) ans++;
	}

	// 自动去重的全排列
	public static void permutation(int k, int[] path) {
		if(k==TOTAL) {
			check(path);
			return;
		}
		for(int i=0;i<TOTAL;i++){
			if(i>0&&comb[i]==comb[i-1]&&vis[i-1]!=0)
				continue;
			if(vis[i]==0){
				vis[i]=1;
				path[k]=comb[i];
				permutation(k+1, path);
				vis[i]=0;
			}
		}
	}
	
	public static void main(String[] args) {
		int[] path=new int[TOTAL];
		permutation(0, path);
		System.out.println(ans);
	}
}

原文地址:https://www.cnblogs.com/fromneptune/p/12482714.html