蓝桥杯 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);
}
}