2017蓝桥杯java B组纸牌三角形

2017蓝桥杯java B组纸牌三角形

1.标题:纸牌三角形
A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法
A
9 6
4 8
3 7 5 2
这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
注意:需要提交的是一个整数,不要提交任何多余内容。

思路:DFS+重复几率计算
这道题是典型的回溯应用,很适合使用递归。

  1. 原理
    全排列(递归)(基于多少种不同的排法)
    在这里插入图片描述
  2. DFS(深度优先搜索算法): 初步模板(简书大佬所著模板供参考)

在这里插入图片描述

3.DFS具体实现模板:

//DFS template
public static void DFS(char[] data,int k){//递归->构造相似性->构造参数
		//出口(条件和方法的参数有关)
		if(k==data.length-1)
		{
			//输出
			for(int i=0;i<data.length;i++)
			{
				System.out.print(data[i]+" ");	
	
			}
	System.out.println();
		}
		//试探
		for(int i=k;i<data.length;i++){//k代表要与后面元素交换的当前位置
			{char temp;
			temp=data[k];
			data[k]=data[i];
			data[i]=temp;
		}
		//递归
		DFS(data,k+1);
		//回溯
		{
			char temp;
			temp=data[k];
			data[k]=data[i];
			data[i]=temp;
		}
	}	
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		char[] data= "ABCDEFG".toCharArray();//字符串转换为字符数组
		DFS(data,0);
	}
  1. 重复几率分析:
    相同的一款:旋转3种*对称2种=6种
    镜像:
    在这里插入图片描述在这里插入图片描述
    答案
//纸牌三角形
public class 纸牌三角形 {
	static int count=0; 
	public static void f(int[] arr,int k)
	{
		if(k==arr.length-1)
		{
			if(arr[0]+arr[1]+arr[2]+arr[3]==arr[3]+arr[4]+arr[5]+arr[6]&&arr[0]+arr[1]+arr[2]+arr[3]==arr[6]+arr[7]+arr[8]+arr[0]){
				count++;
			}
		}
		int temp = 0;
		for(int i = k;i<arr.length;i++)
		{
			{
				temp = arr[k];arr[k]=arr[i];arr[i]=temp; 
			}
			f(arr,k+1);
			{
				temp = arr[k];arr[k]=arr[i];arr[i]=temp;
			}
		}
		
	
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arr[] ={1,2,3,4,5,6,7,8,9};
		f(arr,0);
		System.out.println(count/6);
	}

}

发布了2 篇原创文章 · 获赞 3 · 访问量 68

猜你喜欢

转载自blog.csdn.net/weixin_40086938/article/details/105251389