题目描述
将编号为 1~10 的 10 本书排放在书架上,要求编号相邻的书不能放在相邻的位
置。
请计算一共有多少种不同的排列方案。
解法一
解题思路
蛮力法
1.求出十本书的全排列,存入数组temp_list
2.编写check()函数判断某一确定排列是否有两本书在编号相邻的同时位置相邻,如果存在返回false,表示该排列不成立,否则,则相反。
3.遍历temp_list数组求成立排列个数
python代码
#图书排列,答案479306
#判断该排列顺序是否矛盾,不矛盾返回true
def check(a):
length = len(a)
for i in range(1,length):
if abs(a[i] - a[i-1]) == 1:
return False
return True
#全排列
def permutation(a, Already_num):
global temp_list
if len(a) == 0:
temp_list.append(Already_num)
return
for i, element in enumerate(a):
permutation(a[:i]+a[i+1:], Already_num+[element])
return temp_list
if __name__ == "__main__":
a = [1,2,3,4,5,6,7,8,9,10]
temp_list = []
permutation(a,[])
ans = 0
for l in temp_list:
if check(l):
ans += 1
print(ans)
运行结果
java代码
package 蓝桥杯训练营第一周作业;
/*图书排列,答案479306*/
public class homework05 {
/*判断该排列顺序是否矛盾,不矛盾返回true*/
private static boolean check(int[] a) {
for (int i=1; i < a.length; i++) {
if( a[i] -a[i-1] == 1 || a[i] -a[i-1] == -1)
return false;
}
return true;
}
static int ans;
/*全排列*/
private static int permutation(int[] a,int start,int end) {
int i,tmp;
if (start == end) {
// for (j = 0; j < a.length; j++) {
// System.out.printf("%d ",a[j]);
// }
//System.out.println();
if (check(a)) {
ans += 1;
//System.out.println(true+" ans = "+ans);
}
// else
// System.out.println(false);
}
for (i = start; i < a.length; i++) {
tmp = a[start];a[start] = a[i];a[i] = tmp; //交换a[start]和a[i]的值
permutation(a,start+1,end);
tmp = a[start];a[start] = a[i];a[i] = tmp;//交换a[start]和a[i]的值
}
return ans;
}
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4,5,6,7,8,9,10};
int res;
ans = 0;
res = permutation(a,0,a.length);
System.out.println(res);
}
}
运行结果