通过这几天的刷题,发现蓝桥惯出的一种题型----全排列+check()。
也就是在求出所有全排列的结果后,并检查每种结果是否满足题目的条件得出最终答案。

一、核心

递归式全排列或字典序式全排列
补:有重复元素求全排列,要求结果不重复时,要用字典序求解,递归求解会重复的(eg:前两个元素相同,第二个元素和第一个元素交换位置的排列结果和第一种结果相同)。

二、代码实现

1.递归式(未按字典序输出)

import java.util.Scanner;public class Permutations {public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextInt();int[] arr=new int[n];for (int i = 0; i < arr.length; i++) {arr[i]=i+1;}permutation(arr,0);}private static void permutation(int[] arr, int start) {if (start==arr.length) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();}for (int i = start; i < arr.length; i++) {swap(arr, start, i);permutation(arr, start+1);swap(arr, start, i);}}private static void swap(int[] arr,int i,int j) {int t=arr[i];arr[i]=arr[j];arr[j]=t;}
}

2.字典序

import java.util.Scanner;public class PermutationsWithDictionary {public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextInt();int[] arr=new int[n];for (int i = 0; i < arr.length; i++) {arr[i]=in.nextInt();}permutation(arr);}private static void permutation(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();while (true) {int index1=-1;int index2=-1;for (int i = arr.length-2; i >=0; i--) {if (arr[i]<arr[i+1]) {index1=i;break;}}if (index1==-1) {return;}for (int i = arr.length-1; i >=index1+1; i--) {if (arr[i]>arr[index1]) {index2=i;break;}}swap(arr, index1, index2);reverse(arr,index1+1,arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();}}private static void reverse(int[] arr, int left,int right) {for (int i = left,j=right; i < j; i++,j--) {swap(arr, i, j);}}private static void swap(int[] arr,int i,int j) {int t=arr[i];arr[i]=arr[j];arr[j]=t;}
}

三、历年真题

注:前面的标号对应于该题在竞码平台的题目id
7005 寒假作业
7006 剪邮票
7011 凑算式
7019 搭积木

1.寒假作业

package lanqiaobei_page1;import java.util.Scanner;public class T7005 {static int ans = 0;public static void main(String[] args) {int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };permutation(arr, 0);System.out.println(ans);}private static void permutation(int[] arr, int start) {if (start == arr.length) {if (check(arr)) {ans++;}}for (int i = start; i < arr.length; i++) {swap(arr, i, start);permutation(arr, start + 1);swap(arr, i, start);}}private static void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}private static boolean check(int[] ia) {if (ia[0] + ia[1] == ia[2] && ia[3] - ia[4] == ia[5] && ia[6] * ia[7] == ia[8] && ia[10] * ia[11] == ia[9]) {return true;}return false;}
}

2.剪邮票

package lanqiaobei_page1;
//有一定难度,涉及到全排列和检查连通性。(以及一维数组如何转成二维数组)
//题型:有相同元素的数组求没有重复结果的全排列。
public class T7006 {static int ans = 0;public static void main(String[] args) {
//      注意第一个数组要是字典序最小的那个。
//      用字典序求出来的全部排列是不重复的,所以这道题要用这个方法求解,用递归求出的所有排列有重复的,结果当然也会重复。int[] ia= {0,0,0,0,0,0,0,1,1,1,1,1};permutation(ia);System.out.println(ans);}private static void permutation(int[] arr) {int[][] temp=new int[3][4];for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {temp[i][j]=arr[i*4+j];}}
//      第一个排列,转换成二维数组后,检查是否只有一个连通图。if (check(temp)) {ans++;}while (true) {int index1=-1;int index2=-1;for (int i = arr.length-2; i >=0; i--) {if (arr[i]<arr[i+1]) {index1=i;break;}}if (index1==-1) {return;}for (int i = arr.length-1; i >=index1+1; i--) {if (arr[i]>arr[index1]) {index2=i;break;}}swap(arr, index1, index2);reverse(arr,index1+1,arr.length-1);for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {temp[i][j]=arr[i*4+j];}}if (check(temp)) {ans++;}}}private static boolean check(int[][] map) {int cnt=0;for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[0].length; j++) {if (map[i][j]==1) {dfs(map,i,j);cnt++;}}}if (cnt==1) {return true;}return false;}private static void dfs(int[][] map, int i, int j) {int row=map.length;int col=map[0].length;map[i][j]=0;if (i-1>=0 && map[i-1][j]==1) dfs(map, i-1, j);if (i+1<row && map[i+1][j]==1) dfs(map, i+1, j);if (j-1>=0 && map[i][j-1]==1) dfs(map, i, j-1);if (j+1<col && map[i][j+1]==1) dfs(map, i, j+1);}private static void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}private static void reverse(int[] arr, int left,int right) {for (int i = left,j=right; i < j; i++,j--) {swap(arr, i, j);}}
}

3.凑算式

package lanqiaobei_page1;
//想错了,结果应该是通分后整除的结果是10,误想成了每个结果四舍五入后之和是10
import java.util.Scanner;public class T7011 {static int ans = 0;public static void main(String[] args) {int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };permutation(arr, 0);System.out.println(ans);}private static void permutation(int[] arr, int start) {if (start == arr.length) {if (check(arr)) {ans++;}}for (int i = start; i < arr.length; i++) {swap(arr, start, i);permutation(arr, start + 1);swap(arr, start, i);}}private static boolean check(int[] arr) {int fenzi=arr[3] * 100 + arr[4] * 10 + arr[5];int fenmu=arr[6] * 100 + arr[7] * 10 + arr[8];if ((arr[1]*fenmu+arr[2]*fenzi)%(arr[2]*fenmu)==0 && arr[0]+(arr[1]*fenmu+arr[2]*fenzi)/(arr[2]*fenmu)==10) {return true;}return false;}private static void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}
}

4.搭积木

package lanqiaobei_page1;public class T7019 {static int ans=0;public static void main(String[] args) {int[] arr=new int[] {0,1,2,3,4,5,6,7,8,9};permutation(arr,0);System.out.println(ans);}private static void permutation(int[] arr, int start) {if (start==arr.length) {if (check(arr)) {ans++;}}for (int i = start; i < arr.length; i++) {swap(arr,i,start);permutation(arr, start+1);swap(arr,i,start);}}private static boolean check(int[] arr) {if (arr[0]<arr[1] && arr[0]<arr[2] && arr[1]<arr[3] && arr[1]<arr[4] && arr[2]<arr[4] && arr[2]<arr[5] && arr[3]<arr[6] && arr[3]<arr[7] && arr[4]<arr[7] && arr[4]<arr[8] && arr[5]<arr[8] && arr[5]<arr[9] ) {return true;}return false;}private static void swap(int[] arr, int i, int j) {int t=arr[i];arr[i]=arr[j];arr[j]=t;}
}

全排列+check检验相关推荐

  1. 蓝桥杯2013-2016真题

    javaB组蓝桥杯省赛历年真题(23-16) 文章目录 历年真题 第一次蓝桥杯百校真题大联赛 尺取法 概念 反向扫描 同向扫描 真题 2013年真题 一.世纪末的星期 二.马虎的算式 三.振兴中华 四 ...

  2. [nowcoder]优美的回文串

    题面 链接:https://www.nowcoder.com/questionTerminal/cf00949583604f8c9f3315fd64236a8c?orderByHotValue=1 来 ...

  3. apt-get常用命令

    一,什么的是apt-get 高级包装工具(英语:Advanced Packaging Tools,简称:APT)是Debian及其衍生发行版(如:ubuntu)的软件包管理器.APT可以自动下载,配置 ...

  4. 直面故障,我们该怎么做?

    This article has been published on 'Network Administrator World' in 2007, copyrights belong to 'Netw ...

  5. Hi3516A开发--apt-get更新

    每次安装新的Ubuntu都会遇到的问题了. apt-get 无法更新. 其原因是apt软件下载源有问题. sudo cp /etc/apt/sources.list /etc/apt/sources. ...

  6. [蓝桥杯]2016蓝桥省赛B组题目及详解

    /*----------------------------------------------------------- [结果填空题]T1 (分值:3) 题目:煤球数目有一堆煤球,堆成三角棱锥形. ...

  7. 2016年 第7届 蓝桥杯 Java B组 省赛解析及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  8. 2017/Province_Java_A/2、9数算式

    标题:9数算式 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. 请你 ...

  9. 2017/Province_Java_B/2、纸牌三角形

    标题:纸牌三角形 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算). 要求每个边的和相等. 下图就是一种排法. A9 64 83 7 5 2 这样的排法可能会有很多. 如果 ...

最新文章

  1. python小猪蹄儿
  2. Knowladge_网站学习_jQuery插件
  3. C++ STL list的成员函数splice的使用
  4. 一些NER的英文数据集
  5. python time
  6. 联想r720自带杜比驱动下载_给心爱的本本装上杜比音效
  7. 2019-9-2-贡献自己的服务器搭建tor中转
  8. 21秋期末考试组织行为学10068k2
  9. 清华本科结业生两年的工作经历-献给游走在黑暗里的清华人
  10. windows文件服务器高可用,通过 Windows Server 2012 构建高可用性的文件服务器
  11. ec20 以太网_整车通讯系统——车载以太网系统系列文章(第一篇)
  12. [转]结合php5与zend_search_lucene来创建一个全文搜索引擎
  13. 极客时间 Redis核心技术与实战 笔记(基础篇)
  14. 你不知道的手动变速箱:换挡杆下的玄机
  15. 用MATLAB程序控制伺服电机,使用MATLAB和Arduino开发板进行步进电机控制
  16. 微软鼠标测试软件,微软Precision鼠标评测:Surface生产力工具最佳搭配
  17. 自考路之大渡考场路远寒
  18. 不同局域网内的主机互访(海蜘蛛实现linux虚拟机与windows虚拟机不同网段间互访)(海蜘蛛的安装与使用)超详细
  19. DNS原理和解析过程
  20. java ninja教程_ninja:一个简单的构建方式

热门文章

  1. MT6169+MT6158设计资料参考指南
  2. MTK MT6169 clock buffer XO3输出控制方法
  3. 安盛信利:数据驱动战略确保长期竞争优势
  4. vnpy抽离candle_chart3 - 实现图形叠加
  5. [Unity]代码控制在3D物体上播放帧动画
  6. [附源码]JSP+ssm计算机毕业设计仓库管理系统设计z3g13【源码、数据库、LW、部署】
  7. 一亩田:有机蔬菜网上卖
  8. idea编译报错 Compilation completed with 1 error and 0 warnings
  9. 【Linux 内核】进程管理 - 进程优先级 ① ( 限期进程 | 实时进程 | 普通进程 | 进程优先级相关字段 )
  10. xp系统更改计算机名BIOS设置,xp怎么进入bios,教您电脑怎么进入bios