package A类有价值的回顾的;
/*
* 0 1 2 3 !!!!!!!!!!!!!!!!!!
* 4 5 6 7 //这个要进入下一层进行判断,完全没必要,可以改写一下
* 8 9 10 11 !!!!!!!!!!!!!!!!!!
*12 13 14 15 要为自己喜欢的事情奋斗一辈子,不能以为可以功成身退,那将会徒增空虚
*/
public class 四阶幻方 {
public static boolean[] b = new boolean[17];
public static int[] d = new int[16];
public static int c = 0;
public static int n = 0;
public static boolean fa(int a){
//a == 3 绝对不对啊,此时d[3]还没被赋值
if(a == 4 ) c = (d[0]+d[1]+d[2]+d[3]);
if(a == 8 && c != (d[4]+d[5]+d[6]+d[7])) return false;
if(a == 12 && c != (d[8]+d[9]+d[10]+d[11])) return false;
if(a == 13 && (c != (d[0]+d[4]+d[8]+d[12]) || c != (d[3]+d[6]+d[9]+d[12]))) return false;
if(a == 14 && c != (d[1]+d[5]+d[9]+d[13])) return false;
if(a == 15 && c != (d[2]+d[6]+d[10]+d[14])) return false;
if(a == 16 && (c != (d[3]+d[7]+d[11]+d[15]) || c != (d[0]+d[5]+d[10]+d[15]) || c != (d[12]+d[13]+d[14]+d[15]))) return false;
return true;
}
public static void f(int a){
if(fa(a) == false) return;
if(a == 16){
if(d[0] == 1){
n++;
System.out.println(n);
}
for(int i=0;i<16;i++){
System.out.print(d[i]+" ");
if(i%4 == 3)
System.out.println();
}
System.out.println("=============");
}
for(int i=1;i<=16;i++){
if(b[i] == false){//if(b[i]==false && isok(i,k)==true){添加一个isok的方法,检验第k个位置选入i是否可以
b[i] = true;
d[a] = i;
f(a+1);
d[a] = 0;
b[i] = false;
}
}
return;
}
public static void main(String[] args) {
d[0] = 1;
b[1] = true;
f(1);
}
}
/*
*把1~16的数字填入4x4的方格中,使得行、列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方。
四阶幻方可能有很多方案。如果固定左上角为1,请计算一共有多少种方案。
比如:
1 2 15 16
12 14 3 5
13 7 10 4
8 11 6 9
以及:
1 12 13 8
2 14 7 11
15 3 10 6
16 5 4 9
就可以算为两种不同的方案。
请提交左上角固定为1时的所有方案数字,不要填写任何多余内容或说明文字。
剪枝条件为:行、列、对角线的和是否为34。。。
*/
四阶幻方.java
最新推荐文章于 2021-10-17 09:52:28 发布