全排列 最详细的解题报告

题目大意:求任意集合的全排列

解题思路:假设数据存放在数组array[0,1...,length-1]中,首先固定下标为first=0的数,计算array[1,...,length-1]的全排列,依次类推,当first==length-1是,输出数组中的数据。当计算完array[1,...,length-1]的全排列后(此时first=0),然后需要将下标为1,...,length-1的所有数与first进行交换,即array中的每一个数都要放在first=0的位置,然后再依次类推。

具体算法(java版)

 1 //将array数组中下标为m和n的数据进行交换
 2     public static void swap(int[] array, int m, int n) {
 3         int x = array[m];
 4         array[m] = array[n];
 5         array[n] = x;
 6     }
 7
 8     //输出array数组中的数据
 9     public static void output(int[] array) {
10         for (int i = 0; i < array.length; i++) {
11             System.out.print(array[i] + "\t");
12         }
13         System.out.println();
14     }
15
16     public static void permutation(int[] array, int first) {
17         if (first == array.length - 1) {// first已经到最后一个元素了,即所有的元素都已经固定了
18             output(array);
19         } else {
20             for (int i = first; i < array.length; i++) {
21                 swap(array, i, first); //交换
22                 permutation(array, first + 1); //first以前的元素都固定了,接下来固定first+1
23                 swap(array, i, first); //还原
24             }
25         }
26     }
27
28     public static void main(String[] args) {
29         int[] array = { 1, 2, 3 }; // 待排列的元素
30         permutation(array, 0);
31     }
时间: 2024-10-09 21:31:16

全排列 最详细的解题报告的相关文章

hihoCoder 1037 数字三角形 最详细的解题报告

题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public class Main { public static int[][] rewards; public static int[][] best; public static void main(String[] args) { Scanner scanner = new Scanner(System

hihoCoder 1051 补提交卡 最详细的解题报告

题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数组中最长连续提交天数. 具体算法(Java版,直接AC) 1 import java.util.Scanner; 2 3 public class Main { 4 5 //计算数组中最长连续提交天数 6 public static int getMax(int[] array) { 7 int[] copy

hihoCoder 1052 基因工程 最详细的解题报告

题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K=2: 0  1  2  3  4  5  6  7 sq1    A  T  A C  G  T  C  T sq2    A  C G T   C  T 从上图可以看出,标有相同彩色的字符相同,sq1的下标为0的字符与sq2的下标为0的字符相同,即 sq1[0]==sq1[2],由此可以得出sq1

POJ 1057 File Mapping 最详细的解题报告

题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘f’开头,文件夹以‘d’开头,‘*’表示一个case的结束,‘#’表示所有输入内容结束. 解题思路:递归创建,最后递归输出.算法比较简单,我就不细说了,具体看代码: 具体算法(java版,可以直接运行) 1 import java.util.*; 2 3 public class Main { 4

A Broken Calculator 最详细的解题报告

题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Dave's calculator is broken. His calculator halts when put more than K kinds of number. Dave wants to input an intege

POJ 1046 Color Me Less 最详细的解题报告

题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ Math.pow((left.green - right.green), 2)+ Math.pow((left.blue - right.blue), 2)) 表示两个不同颜色的之间的距离(以left和right为例,left和right分别为两种不同的颜色),现给出16组目标颜色,剩下的为待匹配的颜

POJ 1050 To the Max 最详细的解题报告

题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵state,state[j][k]用来存放矩阵的某行中第j到k个元素的最大值: 2.对于行如何处理呢?我们可以将第一行中的N个元素的所有组合的最大值存放在state中,如果有哪个值小于0,清零,因为它没有做任何贡献:定计算第二行时与第一行的值(全部大于等于0)进行累加,这样就完成了第一行与第二行的累

POJ 1047 Round and Round We Go 最详细的解题报告

题目链接:Round and Round We Go 解题思路:用程序实现一个乘法功能,将给定的字符串依次做旋转,然后进行比较.由于题目比较简单,所以不做过多的详解. 具体算法(java版,可以直接AC) 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner scanner = new Scanner(System.in); 7 Stri

POJ 1063 Flip and Shift 最详细的解题报告

题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3个盘子 解题思路:第一种操作表明你可以对任意一个盘子执行第二种操作,所以重点在于第二种操作.仔细分析一下会发现,第二种操作其实就是将某一个盘子当前的index加2,所以我们可以先统计一下黑色盘子的个数count,然后用一个数组将所有的盘子存起来,使数组中0-count所存放的是黑色盘子(通过下标加2