1. 程式人生 > >Java回溯法對數字的全排列

Java回溯法對數字的全排列

一、對於不重複數字的全排列(例如:1,2,3,4,5,7,8,9)

1.用數學的方法來算很簡單,排列的結果是9!種情況;

下面是簡單的一個程式碼的例子:
public class Main {
	static int count = 0;
	public static void main(String[] args) {
		int[] a = {1,2,3};
		test(a,0);
		System.out.println(count);
	}
	public static void test(int[] a,int b){
		if(b>=a.length){
			count++;
			System.out.println(java.util.Arrays.toString(a));
		}
		for (int i = b; i < a.length; i++) {
			{int k = a[b];a[b] = a[i];a[i] = k;}//兩個數字,進行交換
			test(a,b+1);//用遞迴進行下一個數的交換
			{int k = a[b];a[b] = a[i];a[i] = k;}//再次交換兩個數字,換回來
		}
	}
}

輸出結果:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
6

二、有些時候,有重複的數字進行排列組合(例如:1,2,2)

這樣的數字比較少的,很簡單一眼就能看得出有3種情況的排列;

把上面的程式碼稍做判斷就可以的到重複數字的全排列:

public class Main {
	static int count = 0;
	public static void main(String[] args) {
		int[] a = {1,2,2};
		test(a,0);
		System.out.println(count);
	}
	public static void test(int[] a,int b){
		if(b>=a.length){
			count++;
			System.out.println(java.util.Arrays.toString(a));
		}
		for (int i = b; i < a.length; i++) {
			if(!is(a,b,i)) continue; 
			{int k = a[b];
			a[b] = a[i];
			a[i] = k;}
			test(a,b+1);
			{int k = a[b];
			a[b] = a[i];
			a[i] = k;}
		}
	}
	/*排除重複情況的組合*/
	public static boolean is(int[] a,int b,int i){
		for (int j = b; j < i; j++) {
			if(a[i]==a[j]){
				return false;
			}
		}
		return true;
	}
}

輸出結果:

[1, 2, 2]
[2, 1, 2]
[2, 2, 1]
3

相關推薦

Java回溯數字排列

一、對於不重複數字的全排列(例如:1,2,3,4,5,7,8,9) 1.用數學的方法來算很簡單,排列的結果是9!種情況; 下面是簡單的一個程式碼的例子: public class Main { static int count = 0; public static vo

演算法java實現--回溯--旅行售貨員問題--排列

旅行售貨員問題的java實現(回溯法--排列樹) 具體問題描述以及C/C++實現參見網址 http://blog.csdn.net/liufeng_king/article/details/8890603 /** * 旅行售貨員問題--回溯法 * @author

9-----輸出排列(遞歸)

inpu 遞歸 col acc end return item AC urn 1、題目:給定一個字符串,輸出所有的字典序。 如: 輸入字符串:‘ac‘,輸出:[‘ac‘,‘ca‘] 輸入字符串:‘abc‘ ,輸出:[‘abc‘,‘acb‘,‘bac‘,‘bca‘,‘cab‘

數字排列

lse test 嘗試 判斷 blog 思維 main 表示 rand 數字全排列 問題描述 給一個不重復的數字數組,寫一個程序,輸出全排列。 比如給定數組: [1, 2, 3] 輸出: [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3,

shell指令碼 冒泡數字排序

整體思路:用前一個值和後面的所有值作比較,將較小的值付給前一值,迴圈完成就能將一組數,從小到大排列。更改比較條件(-gt),就可以將陣列從大到小排列。 #!/bin/sh #sorting following array echo "please input a num

Java使用遞歸實現排列的代碼

return ring out code 使用遞歸 遞歸 != -i 常用 將寫內容過程經常用到的一些內容備份一下,下邊內容是關於Java使用遞歸實現全排列的內容。 public class AllPermutation { public static void m

排列及相關擴充套件演算法(一)——基礎的回溯遞迴實現排列演算法

1.全排列的定義和公式: 從n個數中選取m(m<=n)個數按照一定的順序進行排成一個列,叫作從n個元素中取m個元素的一個排列。由排列的定義,顯然不同的順序是一個不同的排列。從n個元素中取m個元素的所有排列的個數,稱為排列數。從n個元素取出n個元素的一個排列,稱為一個全

java回溯解決n皇后問題

先看問題吧 問題描述:八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。 關於n皇后問題相關的解法很多,在這裡大家可以看看我的寫法

java實現有條件字串排列輸出

package edu.pku.ss.hlj; public class Hlj { public static void main(String[] args) { String s = "abcd";//這裡是要用到的所有陣列成的一個字串,其它字元同樣適

字串的排列排列)——Java回溯

題目描述輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述:輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。Solution:從這張

leetcode:排列II(java回溯

package LeetCode; import java.util.ArrayList; import java.util.List; /* 給定一個可包含重複數字的序列,返回所有不重複的全排列。 示例: 輸入: [1,1,2] 輸出: [ [1,1,2], [1,2,1], [2

leetcode:排列java回溯

package LeetCode; import java.util.ArrayList; import java.util.List; /* 給定一個沒有重複數字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1

排列 II(回溯,寬度優先)

int cmp (const void * a, const void * b){return ( *(int*)a - *(int*)b );} int** permuteUnique(int* nu

回溯排列

全排列 遞迴實現:把元素換到陣列首位,剩下的部分做全排列 def constraint(): return True def bound(): return True def perm_backtracking(depth,lst): size = len

LeetCode刷題Medium篇Permutations排列----回溯backtracking

題目 Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] Output: [ [1,2,3], [1,3,2],

動態規劃,分治,回溯排列,切片

全排列問題,可以從動態規劃狀態方程考慮,也可以從回溯法考慮,二者程式碼遞迴形式的程式碼是一致的,但是理解的角度不同 動態規劃: # 基於動態規劃,狀態方程考慮,f[n] = 首位為所有元素 + f[n-1],這個動態規劃沒有重複 # 子問題,每一種情況都需要遍歷 class Solu

回溯求解排列問題(可去除重複排列

1. 回溯法使用標記法求解 include <cstdio> include <algorithm> using namespace std; int vis[100

演算法——回溯(子集、排列、皇后問題)

1、定義 回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。 回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。 回溯演算法解決問題的一般步驟為: 1、定義一個解空間,它包含問題的解。 2、利

LeetCode-----46.Permutations&&47.Permutations II (排列----回溯

Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example,[1,1,2] have the foll

Java下實現無重字串的排列(遞迴和回溯方法)

開發十年,就只剩下這套架構體系了! >>>