1.纸牌三角形

image.png

1.1思路分析

将问题抽象出来,不要堪称是一个三角形,而是把三角形看成是一维数组。假设A是起点,那么就是形如A,2,3,4,5,6,7,8,9的一个数组,求排法的数量,很明显,就是让我们求满足要求的全排列,dfs(回溯)的退出条件就是凑够了9各数字,此时再判断三条边,如果都相等,那么说明满足等边三角形的要求,我们的count++;
注意:题目说明了旋转和镜像后的算同一种。已知,一个正三角形,他旋转能产生另外两个与原来相同的三角形(总共三个),镜像能产生总共两个,所以2*3=6,这个6就是我们最后求得的数值再/6就是结果

1.2代码

  1. package com.iheima;
  2. import java.util.LinkedList;;
  3. public class Main3 {
  4. static LinkedList<Integer> list=new LinkedList<>();
  5. static int count=0;
  6. public static void main(String[] args) {
  7. boolean[] vis=new boolean[10];
  8. int[] arr=new int[10];
  9. for (int i = 1; i < arr.length; i++) {
  10. arr[i]=i;
  11. }
  12. vis[0]=true;
  13. dfs(arr,1,vis);
  14. // System.out.println(res);
  15. System.out.println(count/6);
  16. }
  17. public static void dfs(int[] arr,int start,boolean[] vis){
  18. if(list.size()==arr.length-1){
  19. int a=list.get(0)+list.get(1)+list.get(2)+list.get(3);
  20. int b=list.get(3)+list.get(4)+list.get(5)+list.get(6);
  21. int c=list.get(6)+list.get(7)+list.get(8)+list.get(0);
  22. if(a==b&&b==c){
  23. count++;
  24. return;
  25. }
  26. }
  27. for(int i=1;i<arr.length;i++){
  28. if(vis[i])continue;
  29. vis[i]=true;
  30. list.add(arr[i]);
  31. dfs(arr,start+1,vis);
  32. list.removeLast();
  33. vis[i]=false;
  34. }
  35. }
  36. }