第八届蓝桥杯省赛JavaB组-纸牌三角形

本文探讨了第八届蓝桥杯省赛JavaB组的纸牌三角形问题,详细解析了如何通过全排列和去重策略找到所有可能的解决方案。介绍了暴力排序和深度优先搜索(DFS)两种解题方法,最终给出了正确答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第八届蓝桥杯省赛JavaB组-纸牌三角形

纸牌三角形

标题:纸牌三角形

A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法(如有对齐问题,参看p1.png)。

     A
   9   6
 4       8
3  7   5   2

这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
注意:需要提交的是一个整数,不要提交任何多余内容。

思路

这道题刚刚看到的时候,我第一个想到的就是既然要考虑到旋转和镜像去重问题,那我确定三角形的三个顶点即可确定一个等边三角形,这样只需要将三角形周长45加上三角形确定的三个顶点的和取模,等于零的解即为排法数量。(不知道有没有小伙伴有和我一样的想法)

错解
嗯,事实证明,这样行不通,我最初的代码如下:

public class TEST {
	public static void main(String[] args) {
		int[] a= {1,2,3,4,5,6,7,8,9};
		int sum=0,summ=0;
		double a1=0;
		int total=0;
		for(int i=0;i<9;i++)
		{
			for(int j=0;j<9;j++)
			{
				for(int l=0;l<9;l++)
				{
					if(i!=j&&i!=l&&j!=l)
					{
						total++;
						summ=a[i]+a[j]+a[l];
						sum=45+summ;
						a1=sum%3;
						if(a1==0) {
							total++;
							System.out.println("a["+i+"]"+"、a["+j+"]"+"、a["+l+"]");
						}
					}	
				}
			}		
		}		
		System.out.println(total);		
	}

}

运行后的结果:180
与答案144不符,错误。所以我发现我的想法有问题,180个里面有36个不能实现等边三角形。

正解
1.这道题是全排列问题
2. 全排列问题可以通过暴力排列dfs搜索方法实现
3. 计算结束,注意去重问题 ,旋转有三种三角形,镜像有两种三角形,所以最后 计算结果要除以3,除以2,总共除以6.

暴力排序方法

import java.util.*;

public class TEST{
	public static void main(String[] args) {
		int sum=0;
		for(int a=1; a<=9; a++)
			for(int b=1; b<=9; b++) {
				if(b==a) continue;
				for(int c=1; c<=9; c++) {
					if(c==a||c==b) continue;
					for(int d=1; d<=9; d++) {
						if(d==a||d==b||d==c) continue;
						for(int e=1; e<=9; e++) {
							if(e==a||e==b||e==c||e==d) continue;
							for(int f=1; f<=9; f++) {
								if(f==a||f==b||f==c||f==d||f==e) continue;
								for(int g=1; g<=9; g++) {
									if(g==a||g==b||g==c||g==d||g==e||g==f) continue;
									for(int h=1; h<=9; h++) {
								 if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
										for(int i=1; i<=9; i++) {
			                  				if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)continue;
											if(a+b+d+f==a+c+e+i && a+b+d+f == f+g+h+i)sum++;								                       
										}
									}										
								}
							}
						}
					}
				}
			}
		System.out.println(sum/6);
	}
}

dfs搜索

import java.util.Scanner;
 
public class TEST {
	static int sum = 0;
	static int a[] = new int[9];//表示A-9的纸牌
	static int vis[] = new int[10];//表示纸牌是否使用
	
    public static void main(String[] args) {
		dfs(0);
		System.out.println(sum/3/2);
	}
 
	public static void dfs(int n) {//n表示当前要操作的位置
		if(n==9){
			if(a[0]+a[1]+a[2]+a[3]==a[3]+a[4]+a[5]+a[6] && a[3]+a[4]+a[5]+a[6]==a[6]+a[7]+a[8]+a[0]){
				sum++;//如果是等边三角形,则sum++
			}	
			return ;
		}
		for(int i=1;i<=9;i++){
			if(vis[i]==0){//如果纸牌未被使用过
				a[n]=i;//将第n个位置放置第i个纸牌
				vis[i]=1;//表示第i纸牌已经被使用
				dfs(n+1);//进入下一个位置
				vis[i]=0;//将当前纸牌放回
			}
		}
	}
}
### 蓝桥杯个人 Java B 题型及考试范围 #### 一、题型概述 蓝桥杯个人针对Java B的比题目通常涵盖了多个方面,旨在全面考察参者的编程能力以及算法思维。比中的题目形式多样,包括但不限于选择题、填空题、程序设计题等。 #### 二、具体题型分析 ##### (一)基础概念理解 这类题目主要测试选手对计算机基础知识的理解程度,比如数据结构的选择与应用、基本语法掌握情况等。例如,在往年的比中曾出现过关于字符串处理、数操作等方面的知识点考查[^1]。 ##### (二)逻辑推理与简单算法实现 此类问题往往给出一定的情景描述或规则设定,要求根据给定条件编写能够解决问题的小段代码或者直接写出解法思路。像提到的幸运数字问题,就需要利用特定规律来筛选符合条件的结果并对其进行适当运算处理[^3]。 ##### (三)复杂度较高的算法挑战 随着难度增加,部分考题会涉及到更深层次的数据结构运用或是较为复杂的算法模型构建。以REPEAT程序为例,这道题不仅考验了循环语句的应用技巧,还隐含着优化时间空间效率的要求;而有关于病毒检测方案的设计,则引入了数学建模的思想去寻找最优分策略[^2]。 ##### (四)综合项目开发模拟 有时也会设置一些贴近实际应用场景的任务场景,让考生在一个相对完整的框架下完成指定功能模块的编码工作。上述提供的阶乘累加案例即属于这一范畴——它既包含了函数定义调用的基础训练,又加入了大数取余这样具有现实意义的操作细节。 #### 三、注意事项 - 对于所有涉及数值计算的回答,应当注意按照规定的方式进行结果截断或取模运算,确保最终输出符合标准格式[^4]。 - 此外,某些特殊类型的布局排列问题也可能成为考点之一,如纸牌摆放模式下的路径规划等[^5]。 ```java // 示例:如何在Java中执行简单的取模运算 public class ModExample { public static void main(String[] args) { int result = (int)(Math.pow(2, 31) % 1000000007); System.out.println(result); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值