蓝桥杯-全排列筛选(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. django - 总结 - redis缓存

    八.redis 补充- 操作 - 增删改查 对字典,重新设计结构,增删改查. hmset  keys  hget   scan_iter  hgetall  import redis import j ...

  2. undefined reference to symbol 'pthread_create@@GLIBC_2.2.5' 的修改方法

    在编译DSO代码的时候会如下这样的问题: 检查DSO,在程序中没有用到pthread,但是在编译的时候却出现此类问题.仔细想了想了一下,在程序中用到了C++11中的线程std::thread,个人猜测 ...

  3. C# - Visual Studio简明操作

    Visual Studio简明操作 安装Northwind示例数据库 运行安装程序,结束安装后,再CMD中输入以下命令 cd C:\SQL Server  Sample Databases(回车) s ...

  4. torch.linspace,unsqueeze()以及squeeze()函数

    1.torch.linspace(start,end,steps=100,dtype) 作用是返回一个一维的tensor(张量),其中dtype是返回的数据类型. import torch print ...

  5. codeforces 787D - Legacy 线段树优化建图,最短路

    题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...

  6. C++设计模式——桥接模式

    问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等:而图形又可以加上不同的颜色,然后,我们就可以画出红色的长方形,绿色的长方形:红色的圆形,绿色的圆形等等.而这种图形的形状在变化,图形的颜色也 ...

  7. C++入门篇二

    c++是c语言的增强版,但是和c语言之间有何区别呢? c和c++的区别: 1.全局变量检测增强int a;int a=10; 2.函数检测增强,参数类型增强,返回值检测增强,函数调用参数检测增强(参数 ...

  8. Solr坏境搭建

    1.1. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压solr. 第三步:安装Tomcat,解压缩即可. 第四步:把dist目录下的solr.war部署到Tomcat下. ...

  9. Python-Django基础

    django目录 -settings -urls -views ******强调:setting中'django.middleware.csrf.CsrfViewMiddleware'中间件先注释掉 ...

  10. 利用特性和反射给泛型Model赋值

    为了解决从数据库读取的表字段和自己建的viewModel字段名称不相符的问题 本人小白,初次将特性及反射应用到实例,写的不好的地方还请大家多多包涵 新建一个控制台应用程序命名为ReflectAndAt ...