题目

考察
全排列+递归
分析
- 在五角星上填数,考虑用 int 数组存数。
- 所有可能的填法,用到了全排列和递归。
- 用数组的每一个元素分别对应五角星的每个位置,这样就完成了将不规则图形问题转化为程序思想。如图所示。
- 通过计算每条边的和判断每条边是否相等,每有一次相等的结果,count++。

注意
因为五角星每个角都有两种相同的情况,所以要结果除以(5*2)。
/**
* 考察全排列,递归
*
* @author Administrator
*
*/
public class 五星填数 {
static int[] numArr;
static int count = 0;
public static void main(String[] args) {
numArr = new int[] { 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 };
int result = f(numArr, 0);
System.out.println(result / (5 * 2));// 因为是五角星,所以每个角都有两个对称,所以除以(5*2)
}
/**
* 对数组进行全排列,计算所有可能结果
*
* @param numArr
* 数组
* @param i
* 开始排列位置
* @return 所有可能结果
*/
private static int f(int[] numArr, int i) {
// 递归出口
if (i == 10) {
if (check()) {
count++;
}
}
// 全排列,递归
for (int j = i; j < numArr.length; j++) {
int temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
f(numArr, i + 1);
// 回溯
temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
}
return count;
}
/**
* 判断五角星每条边的和是否相等
*
* @return true 相等;false 不相等
*/
private static boolean check() {
int a1 = numArr[0] + numArr[2] + numArr[5] + numArr[8];
int a2 = numArr[0] + numArr[3] + numArr[6] + numArr[9];
int a3 = numArr[1] + numArr[2] + numArr[3] + numArr[4];
int a4 = numArr[1] + numArr[5] + numArr[7] + numArr[9];
int a5 = numArr[4] + numArr[6] + numArr[7] + numArr[8];
if (a1 == a2 && a2 == a3 && a3 == a4 && a4 == a5) {
return true;
}
return false;
}
}
该博客讨论了如何在五角星上进行全排列填数的问题,利用递归和全排列算法,将数填入五角星的各个位置,并通过检查每条边的和来确保边之和相等。在实现过程中需要注意五角星每个角有两种相同情况,因此最终结果需除以(5*2)。
1303

被折叠的 条评论
为什么被折叠?



