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+重复几率计算
这道题是典型的回溯应用,很适合使用递归。
- 原理
全排列(递归)(基于多少种不同的排法)
- 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);
}
- 重复几率分析:
相同的一款:旋转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);
}
}