全排列(例子:组素数,凑算式,搭积木)

全排列:

模板:

public class 模板 {

	static int[] arr={};   //方法外定义数组,放置要排列的符号
	static count=0;   //记录符合要求的个数
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f(0);
		System.out.println(count);
	}
	static void f(int k)
	{
		if(k==arr.Length)   //每排列好一组,便check判定是否符合条件,一般确定arr.Length的长度直接填数字就是
			check();
		
		for(int i=k;i<arr.Length;i++)    //每一个i确定一组数据里的一位数,k表示当前确定到第几位数字
		{
		
			int temp=arr[k];
			arr[k]=arr[i];
			arr[i]=temp;
			
			f(k+1);   //确定下一位
			
			//回溯,每确定好一组数字,便让原先交换的符号,交换回去,以便下次交换
			temp=arr[k];
			arr[k]=arr[i];   
			arr[i]=temp;
			
		}
	}
	static void check()
	{
		//判断条件,成功则count++
	}
}

例子:

组素数
1,4,9,9组成的四位数中,有多少位是素数

package 复习;

import java.lang.Thread.State;
import java.util.HashSet;
import java.util.Set;

public class _13_2组素数 {
	static int[] arr={1,4,9,9};   //方法外定义数组,放置要排列的符号
	static Set<Integer> set=new HashSet<>();  //自带方法可去重
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f(0);
		System.out.println(set.size());
	}
	static void f(int k)
	{
		if(k==4)   //每确定好一个四位数(一个序列)便dioa调用方法确定是不是素数
			check();
		
		for(int i=k;i<4;i++)    //每一个i确定一组数字里的一位数,k表示当前确定到第几位数字
		{
		
			int temp=arr[k];
			arr[k]=arr[i];
			arr[i]=temp;
			
			f(k+1);   //确定下一位
			
			//回溯,每确定好一组数字,便让原先交换的数字,交换回去,以便下次交换
			temp=arr[k];
			arr[k]=arr[i];   
			arr[i]=temp;
			
		}
	}
	static void check()
	{
		int sz=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
		for(int i=2;i<sz/2;i++)
		{
			if(sz%i==0)
			{
				set.add(sz);   //哈希自带的去重,如果重复,便不会再度添加
				break;
			}
		}
	}
}

凑算式:
符合A + B / C + DEF / GHI = 10的算式有几条
这个算式中A-I代表1-9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

化简算式可得:A + ( B * GHI + C * DEF ) / C * GHI = 10

package 复习;

public class _16_6凑算式 {
	static int[] arr={1,2,3,4,5,6,7,8,9};
	static int js=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f(0);
		System.out.println(js);
	}
	
	static void f(int k)
	{
		if(k==9)   //一共九位数
			check();
		
		for(int i=k;i<9;i++)   //一共九位数
		{
			int temp=arr[i];
			arr[i]=arr[k];
			arr[k]=temp;
			
			f(k+1);
			
			temp=arr[i];
			arr[i]=arr[k];
			arr[k]=temp;
		}
	}
	static void check()
	{
		int x=arr[3]*100+arr[4]*10+arr[5];
		int y=arr[6]*100+arr[7]*10+arr[8];
		if((arr[1]*y+arr[2]*x)%(arr[2]*y)==0)   //防止出现精度过高小数点丢失现象
			if((arr[1]*y+arr[2]*x)/(arr[2]*y)+arr[0]==10)
		     	js++;
	}
}

搭积木:

搭积木

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

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

下面是两种合格的搭法:

0
1 2
3 4 5
6 7 8 9

0
3 1
7 5 2
9 8 6 4

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

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

package 复习;

public class _16_7搭积木 {
	static int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	static int js = 0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f(0);
		System.out.println(js);
	}

	static void f(int k) {
		if (k == 10)
			js++;

		for (int i = k; i < 10; i++) {
			int temp = arr[k];
			arr[k] = arr[i];
			arr[i] = temp;

			if (k == 1 && arr[1] < arr[0] || k == 2 && arr[2] < arr[0] || k == 3 && arr[3] < arr[1]
					|| k == 4 && (arr[4] < arr[1] || arr[4] < arr[2]) || k == 5 && arr[5] < arr[2]
					|| k == 6 && arr[6] < arr[3] || k == 7 && (arr[7] < arr[3] || arr[7] < arr[4])
					|| k == 8 && (arr[8] < arr[4] || arr[8] < arr[5]) || k == 9 && arr[9] < arr[5]) {  //提前剪枝,符合题目条件则可以确定下一位,随后自动组合成一组数据,不符合则还原回去后,执行下一轮循环
				temp = arr[k];
				arr[k] = arr[i];
				arr[i] = temp;
				continue;
			}

			f(k + 1);

			temp = arr[k];
			arr[k] = arr[i];
			arr[i] = temp;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值