/**仔细观察下面的数字组成的三角形:
3
1 4
5 6 2
看出什么特征吗?
首先,它包含了1~6的连续整数。
重要的是:每个数字都是其下方相邻的两个数字的差(当然是大数减去小数)
满足这样特征的三角形,称为:差三角。
你的任务是找出1~15的整数组成的一个更大的差三角。其形如:
?
4 ?
? ? ?
? ? ? ?
? ? ? ? ?
*/
/**仔细观察下面的数字组成的三角形:
3
1 4
5 6 2
看出什么特征吗?
首先,它包含了1~6的连续整数。
重要的是:每个数字都是其下方相邻的两个数字的差(当然是大数减去小数)
满足这样特征的三角形,称为:差三角。
你的任务是找出1~15的整数组成的一个更大的差三角。其形如:
?
4 ?
? ? ?
? ? ? ?
? ? ? ? ?
*/
public class ChaSanJiao {
//分为4层的检测
static boolean check1(int[] a) {
return a[0] == Math.abs(a[1] - a[2]);
}
static boolean check2(int[] a) {
return a[1] == Math.abs(a[3] - a[4]) && a[2] == Math.abs(a[4] - a[5]);
}
static boolean check3(int[] a) {
return a[3] == Math.abs(a[6] - a[7]) && a[4] == Math.abs(a[7] - a[8])
&& a[5] == Math.abs(a[8] - a[9]);
}
static boolean check4(int[] a) {
return a[6] == Math.abs(a[10] - a[11])
&& a[7] == Math.abs(a[11] - a[12])
&& a[8] == Math.abs(a[12] - a[13])
&& a[9] == Math.abs(a[13] - a[14]);
}
//展示结果
static void show(int[] a) {
System.out.println(" " +a[0]);
System.out.println(" " +a[1] + " " + a[2]);
System.out.println(" " +a[3] + " " + a[4] + " " + a[5]);
System.out.println(" " +a[6] + " " + a[7] + " " + a[8] + " " + a[9]);
System.out.println(a[10] + " " + a[11] + " " + a[12] + " " + a[13]
+ " " + a[14]);
}
static void f(int[] a, int k) {
// System.out.print(k+" ");
if (k == 3 && !check1(a))
return;
if (k == 6 && !check2(a))
return;
if (k == 10 && !check3(a))
return;
if (k == 14) {
// show(a);
if (check4(a))
show(a);
return;
}
for (int i = k; i < a.length; i++) {
{
int t = a[k];
a[k] = a[i];
a[i] = t;
} // a[k] <--> a[i]
f(a, k + 1);
{
int t = a[k];
a[k] = a[i];
a[i] = t;
} // a[k] <--> a[i]
}
}
public static void main(String[] args) {
int[] x = new int[15];
for (int i = 0; i < 15; i++)
x[i] = i + 1;
f(x, 0);
}
}
结果
5
4 9
7 11 2
8 1 12 10
6 14 15 3 13
5
9 4
2 11 7
10 12 1 8
13 3 15 14 6