2021-04-17第七届蓝桥杯本科Java B组

这篇博客探讨了使用全排列算法解决数学问题,包括将数字排列组合成特定条件的分数、纸牌三角形排列以及九数组分数问题。通过递归实现全排列,检查每种排列是否满足条件,例如分数值等于1/3,纸牌三角形边之和相等。文章提供了Java代码示例,展示了如何实现这些算法。

一、凑算式(全排列)

在这里插入图片描述
这个算式中A-I代表1~9的数字,不同的字母代表不同的数字。

全排列算法:https://www.bilibili.com/video/BV1dx411S7WR
【例】
对123全排列有:
123
132

213
231

312
321
可见有1打头的,有2打头的,有3打头的
模板:

void perm(int A[],int p,int q){
	for(int i=p;i<=q;i++){    
		swap(A,p,i);	  //p和i交换位置,p打头
		perm(A,p+1,q);    //递归,P打头后,对p后面的继续进行全排列
		swap(A,p,i);      //换回去,防止有重复的
	}
}

把算式通分

public class Cousuanshi {
	private static int count=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int x[]= {1,2,3,4,5,6,7,8,9};
		perm(x,0,8);
		System.out.println(count);
	}
	public static void perm(int x[],int p,int q) {
		if(p>=x.length) {
			int a=x[0]*x[2]*(x[6]*100+x[7]*10+x[8]);
			int b=x[1]*(x[6]*100+x[7]*10+x[8]);
			int c=(x[3]*100+x[4]*10+x[5])*x[2];
			if(a+b+c==10*x[2]*(x[6]*100+x[7]*10+x[8]) )count++;	
		}
		else {
			for(int i=p;i<=q;i++) {
				swap(x,p,i);
				perm(x,p+1,q);
				swap(x,p,i);
			}
		}
	}
	public static void swap(int x[],int p,int q) {
		int temp=x[p];
		x[p]=x[q];
		x[q]=temp;
	}
}

类似题目:
第八届蓝桥杯javaB组-纸牌三角形
A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法
在这里插入图片描述

这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?

public class Zhipai1 {
	private static int count=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[]a= {1,2,3,4,5,6,7,8,9};
		perm(a,0,8);
		System.out.println(count/3/2);
	}
	public static void perm(int a[],int p,int q) {
		if(p>=a.length) {
			int A=a[0]+a[1]+a[2]+a[3];
			int B=a[3]+a[4]+a[5]+a[6];
			int C=a[6]+a[7]+a[8]+a[0];
			if(A==B && B==C && A==C) count++;
		}
		else {
			for(int i=p;i<=q;i++) {
				swap(a,p,i);
				perm(a,p+1,q);
				swap(a,p,i);
			}
		}
		
	}
	public static void swap(int a[],int p,int q) {
		int temp=a[p];
		a[p]=a[q];
		a[q]=temp;
	}
}

第六届蓝桥杯java B组-九数组分数
1,2,3…9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

把除法换成乘法

public class Jiushu {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] a= {1,2,3,4,5,6,7,8,9};
		perm(a,0,8);
		
	}
	public static void perm(int a[],int p,int q) {
		if(p>=a.length) {
			int x=a[0]*1000+a[1]*100+a[2]*10+a[3];
			int y=a[4]*10000+a[5]*1000+a[6]*100+a[7]*10+a[8];
			if(x*3==y) {
				System.out.println(x+" "+y);
			}
		}
		else {
			for(int i=p;i<=q;i++) {  //千万别忘了'='
				swap(a,p,i);
				perm(a,p+1,q);
				swap(a,p,i);
			}
		}
	}
	public static void swap(int a[],int p,int q) {
		int temp=a[p];
		a[p]=a[q];
		a[q]=temp;
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值