蓝桥杯-全排列筛选(java)

蓝桥杯每年必考全排列筛选,一般为填空题;

可以使用for循环暴力破解,但是代码相对较长,也比较乱,不建议使用;

这里使用递归来解决,代码量相对较少,也很好理解;

如下为:0-9的全排列个数;

如需实现从0-9里选n个数只需要改变dfs的参数k的传值就可以了;

全排列模板代码:

public class Main {
static int count=0;// 计数器
public static void main(String[] args) {
int[] arr = new int []{0,1, 2, 3,4,5,6,7,8,9};//数组元素为需要全排列的数,如果想排列字母改成char数组传入就可以了
dfs(arr, 0, 10);// 改成dfs(arr,0,5)就是从中选5个数全排列,之后输出语句选数组前五个输出即可
System.out.println(count);
}
// 递归全排列
public static void dfs(int arr[], int num, int k) {
if (num == k) {// 递归出口
if (panDuan(arr)) {// 筛选
// 里面可以输出,计数,根据具体情况填写
count++;
/*
for (int i = 0; i < k; i++){
    System.out.print(arr[i]);
           }System.out.println();
*/
            }
}
for (int i = num; i < arr.length; i++) {
swap(arr, num, i);
dfs(arr, num + 1, k);
swap(arr, num, i);
}
}
// 筛选方法
private static boolean panDuan(int[] arr) {
      // 根据题目的条件判断筛选
return false;
}
// 数组元素交换,注:变量之间不可以用函数交换
public static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}

例题:

标题:五星填数

如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。

注意:旋转或镜像后相同的算同一种填法。

注意:这里旋转或镜像:旋转有5种相同状态(旋转360度过程中遇到五次一致的状态),每种状态有2种镜像(二维图形镜像一般都是2种),所以结果要除以10;

public class Demo2 {
static int count=0;
public static void main(String[] args) {
int arr[]=new int[]{1,2,3,4,5,6,8,9,10,12};//除去7,11
dfs(arr,0,10);
System.out.println(count/10);
}
private static void dfs(int[] arr, int num, int k) {
// TODO Auto-generated method stub
if(num==k){
if(panDuan(arr)){
count++;// 条件达到,count++;
}
}
for(int i=num;i<arr.length;i++){
swap(arr,num,i);
dfs(arr,num+1,k);
swap(arr,num,i);
}
}
private static void swap(int[] arr, int num, int i) {
// TODO Auto-generated method stub
int temp=arr[num];
arr[num]=arr[i];
arr[i]=temp;
}
private static boolean panDuan(int[] arr) {
// TODO Auto-generated method stub
//判断五条边相等
int a1=arr[0]+arr[2]+arr[5]+arr[8];
int a2=arr[1]+arr[2]+arr[3]+arr[4];
int a3=arr[0]+arr[3]+arr[6]+arr[9];
int a4=arr[1]+arr[7]+arr[5]+arr[9];
int a5=arr[4]+arr[6]+arr[7]+arr[8];
/* 0
1 2 3 4
5 6
7
8 9*/
if(a1==a2&&a2==a3&&a3==a4&&a4==a5){
return true;
}else
return false;
}
}
 

错误或不足的地方欢迎指正!!

最后分享一个喜欢的句子:
其实你我都改变不了什么。萍水相逢,缘开缘灭。

全排列筛选(java)的更多相关文章

  1. n阶行列式的全排列求解(Java)

    上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...

  2. 全排列(java版)

    适用于不同数字的全排列,其实也适用于有重复数字的全排列,只不过的出来的结果有重复,需手动删减掉重复的组合. package testFullPermutation; import java.util. ...

  3. 两种常用的全排列算法(java)

    问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...

  4. 字典序全排列(java实现)

    import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto&q ...

  5. 历届试题 带分数 全排列模板 JAVA

    标题:带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  6. 算法笔记_025:字符串的全排列(Java)

    目录 1 问题描述 2 解决方案 2.1 递归实现 2.2 字典序排列实现   1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所 ...

  7. java实现 批量转换文件编码格式

    一.场景说明 不知道大家有没有遇到过之前项目是GBK,现在需要全部换成UTF-8的情况.反正我是遇到了. eclipse可以改变项目的编码格式,但是文件如果直接转换的话里面的中文就会全部乱码,需要先复 ...

  8. 搭积木(java)-蓝桥杯

    搭积木小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9.搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小.最后搭成4层的金字塔形,必须用完所有的积木.下 ...

  9. Arthas - Java 线上问题定位处理的终极利器

    前言 在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升.负载突高.内存溢出等问题,你需要查命令,查网络,然后 jps.jstack.jmap.jhat.jstat.hprof ...

随机推荐

  1. [再寄小读者之数学篇](2014-10-18 利用 Lagrange 中值定理求极限)

    试求 $$\bex \vlm{n}n^2\sex{x^\frac{1}{n}-x^\frac{1}{n+1}},\quad x>0. \eex$$ 解答: $$\beex \bea \mbox{ ...

  2. [物理学与PDEs]第1章第8节 静电场和静磁场 8.3 静磁场

    1. 静磁场: 由稳定电流形成的磁场. 2. 此时, Maxwell 方程组为 $$\beex \bea \Div{\bf D}&=\rho_f,\\ \rot {\bf E}&={\ ...

  3. 在Spring框架中bean配置文件中constructor-arg标签中没有name元素?

    bean配置文件出现错误的依赖: <beans <beans xmlns="http://www.springframework.org/schema/beans"   ...

  4. vue知多少,你对vue的认识比别人高在哪?

    1.beforeCreated/created区别? beforeCreated钩子能干什么 2.data中使用props 3.get/set依赖收集 get收集依赖(观察者) set 观察者重新求值 ...

  5. 常用window命令

    1.  关闭端口占用程序 先查看端口(8080)占用程序 netstat -ano | findstr 显示结果如下 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1066 ...

  6. 410 for 循环 运算 改变循环的控制流 死循环 遍历数组 定义方法 有名函数匿名函数 定义函数的方法取值 date math 局部变量 函数 局部与全局变量 次幂/随机数/取绝对值/向上取整/平方根

    for(1.表达式1;2.表达式2;3.表达式3){ 4.循环体语句; } 先执行1 ,在执行2, 表达式, 如果2结果为false,退出循环 如果2是true 执行4 在执行3 执行2 举例打印1- ...

  7. C语言网蓝桥杯1116 IP判断

    判断IP地址的合法性, 1.不能出现除数字和点字符以外的的其他字符 2.数字必须在0-255之间,要注意边界. 题目分析: 因为一个IP是又四个数字组成,且可能存在符号和其他字符,故不能用整型数组处理 ...

  8. 可持久化并(xian)查(duan)集(shu)

    随便地点开了这道可持久化并查集,发现了真相...这和并查集有 PI 关系哦.除了find_father(而且还不能路径压缩),全都是线段树0.0 题目链接: luogu.org 题目没什么描述,就是三 ...

  9. C# 在webapi项目中配置Swagger

    这篇文章已经过时了,新的主要配置一个就行了,请参照:http://www.cnblogs.com/alunchen/p/7397396.html Swagger是非常流行用于编辑api给前端同事用.或 ...

  10. 递归遍历所有xml的节点及子节点

    import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; i ...