全排列:
模板:
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;
}
}
}