搭积木(全排列)

1. 问题描述:

小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。

搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

0
1 2
3 4 5
6 7 8 9

0
3 1
7 5 2
9 8 6 4 

请你计算这样的搭法一共有多少种?

请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

768

2. 仔细分析一下题目可以知道这个题目是全排列演变过来的一个题目,我们可以求解出0-9的全排列然后在出口进行判断看相应的位置是否满足要求,假如满足那么计数加1

代码如下:

public class Main{
	static int count;
	public static void main(String[] args) {
		//其实就是全排列
		char arr[] = "0123456789".toCharArray();
		solve(arr, 0);
		System.out.println(count);
	}

	private static void solve(char[] arr, int k) {
		if(k == arr.length - 1){
			isOk(arr);
			return;
		}
		for(int i = k; i < arr.length; i++){
			char c = arr[k];
			arr[k] = arr[i];
			arr[i] = c;
			solve(arr, k + 1);
			c = arr[k];
			arr[k] = arr[i];
			arr[i] = c;
		}
	}

	private static void isOk(char[] arr) {
		if(arr[0] > arr[1]) return;
		if(arr[0] > arr[2]) return;
		if(arr[1] > arr[3]) return;
		if(arr[1] > arr[4]) return;
		if(arr[2] > arr[4]) return;
		if(arr[2] > arr[5]) return;
		if(arr[3] > arr[6]) return;
		if(arr[3] > arr[7]) return;
		if(arr[4] > arr[7]) return;
		if(arr[4] > arr[8]) return;
		if(arr[5] > arr[8]) return;
		if(arr[5] > arr[9]) return;
		count++;
	}
}

我们也可以输出其中的过程来检验自己的结果到底对不对

public class Main{
	static int count;
	public static void main(String[] args) {
		//其实就是全排列
		char arr[] = "0123456789".toCharArray();
		solve(arr, 0);
	}

	private static void solve(char[] arr, int k) {
		if(k == arr.length - 1){
			isOk(arr);
			//System.out.println(String.valueOf(arr));
			return;
		}
		for(int i = k; i < arr.length; i++){
			char c = arr[k];
			arr[k] = arr[i];
			arr[i] = c;
			solve(arr, k + 1);
			c = arr[k];
			arr[k] = arr[i];
			arr[i] = c;
		}
	}

	private static void isOk(char[] arr) {
		if(arr[0] > arr[1]) return;
		if(arr[0] > arr[2]) return;
		if(arr[1] > arr[3]) return;
		if(arr[1] > arr[4]) return;
		if(arr[2] > arr[4]) return;
		if(arr[2] > arr[5]) return;
		if(arr[3] > arr[5]) return;
		if(arr[3] > arr[6]) return;
		if(arr[4] > arr[6]) return;
		if(arr[4] > arr[7]) return;
		if(arr[5] > arr[7]) return;
		if(arr[5] > arr[8]) return;
		print(arr);
		count++;
	}
	
	private static void print(char[] arr) {
		int pos = 0;
		for(int i = 1; i <= 4; i++){
			for(int j = 0; j < 4 - i; j++){
				System.out.print(" ");
			}
			for(int k = pos; k < pos + i; k++){
				System.out.print(arr[k] + " ");
			}
			pos += i;
			System.out.print("\n");
		}
		System.out.print("\n");
	}
}

部分结果如下:

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/88556569
今日推荐