3
1 4
5 6 2
用1——15编出一个像这样的更大的差三角形,其中只给出一个确定的数字4
?
4 ?
? ? ?
* ? ? ?
? ? ? ? ?
1 4
5 6 2
用1——15编出一个像这样的更大的差三角形,其中只给出一个确定的数字4
?
4 ?
? ? ?
* ? ? ?
? ? ? ? ?
请确认*代表哪一个数字?
分析:根据题意可以看出是从下面一行确定上一行,所以直接填最后一行(遍历所有的情况),通过最后一行向上填(并检查可行性)。Java代码:
public class ChaSanJiao {
static int[][] arr;
static int[] num;
static int[] numT;
public static void main(String[] args) {
arr=new int[5][5];
num=new int[15];
numT=new int[15];
getNumArr();
setLastLine(0);
}
//填写最后一行
public static void setLastLine(int r){
if(r==arr.length){
for (int i = 0; i < num.length; i++) {
numT[i]=num[i];
}
if(setArr()){
printf();
}
return;
}
for (int i = num.length-1; i >=0; i--) {
if(num[i]!=0){
arr[4][r]=num[i];
num[i]=0;
setLastLine(r+1);
num[i]=i+1;
}
}
}
//打印结果
public static void printf(){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < i+1; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
//构造num数组
public static void getNumArr(){
for (int i = 0; i < num.length; i++) {
num[i]=i+1;
}
}
//根据差填写arr
public static boolean setArr(){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
int t=Math.abs(arr[arr.length-1-i][j]-arr[arr.length-1-i][j+1]);
if(numT[t-1]==0){
return false;
}else{
arr[arr.length-2-i][j]=t;
numT[t-1]=0;
}
}
}
if(arr[1][0]!=4){
return false;
}
return true;
}
}
结果:
5
4 9
7 11 2
8 1 12 10
6 14 15 3 13