Java【全排列 算法 模板】
| 全排列模板-字符數組 | 2014年 第五屆 藍橋杯【撲克排序】 |
| 全排列模板-無重復元素 | 2016年 第七屆 藍橋杯【湊算式】 |
全排列模板-數組
public class Main {public static void main(String[] args) {int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int arr2[] = {1, 2, 3};f(arr1, 0);}//確認某一個排列的第k位private static void f(int[] arr, int k) {if (k == arr.length) { //全部確認/*for(int x: arr) {System.out.print(x);}System.out.println();*///函數功能區return;}for (int i = k; i < arr.length; i++) { //選定第k位//將第i位和第k位交換int t = arr[i];arr[i] = arr[k];arr[k] = t;// 移交下一層去確認k+1位f(arr, k + 1);//回溯(換回來)t = arr[i];arr[i] = arr[k];arr[k] = t;}} }全排列模板-字符數組
import java.util.HashSet; import java.util.Set;public class Main {static Set<String> set = new HashSet<String>();public static void main(String[] args) {char[] a = {'A', 'A', '2', '2', '3', '3', '4', '4'};f(a, 0);for (String x : set) { // 遍歷set()System.out.println(x);}}private static void f(char[] a, int k) {if (k == a.length) {String s = new String(a);if (check(s)) {// System.out.println(s);set.add(s);}}for (int i = k; i < a.length; i++) {char t = a[k];a[k] = a[i];a[i] = t;f(a, k + 1);t = a[k];a[k] = a[i];a[i] = t;}}private static boolean check(String s) {if (***)return true;return false;} }全排列模板-無重復元素
public class Main {static int a[] = {};static int ans;static boolean check() {if (***)return true;return false;}//遞歸回溯生成全排列,適用于無重復元素的情況 考慮第k位,前面已經排定static void f(int k) {if (k == 數組的元素個數) { // 一種排列已經生成if (check())ans++;}// 從k往后的每個數字都可以放在k位for (int i = k; i < 數組的元素個數; ++i) {{int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1); // 遞歸{int t = a[i];a[i] = a[k];a[k] = t;} // 回溯}}public static void main(String[] args) {f(0);System.out.println(ans);} }【帶分數】題目詳情
標題:帶分數
100 可以表示為帶分數的形式:100 = 3 + 69258 / 714還可以表示為:100 = 82 + 3546 / 197注意特征:帶分數中,數字1~9分別出現且只出現一次(不包含0)。類似這樣的帶分數,100 有 11 種表示法。題目要求: 從標準輸入讀入一個正整數N (N<1000*1000) 程序輸出該數字用數碼1~9不重復不遺漏地組成帶分數表示的全部種數。
注意:不要求輸出每個表示,只統計有多少表示法!
例如: 用戶輸入: 100 程序輸出: 11
再例如: 用戶輸入: 105 程序輸出: 6
資源約定: 峰值內存消耗(含虛擬機) < 64M CPU消耗 < 3000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
【帶分數】題目解答
import java.util.Scanner; //1-9 分別出現一次, 求帶分數表示種數public class Main {static int ans; //全局變量private static int N;public static void main(String[] args) {Scanner sc = new Scanner(System.in);N = sc.nextInt();int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// int[] arr = {1, 2, 3};f(arr, 0); //全排列函數System.out.println(ans);}//確認某一個排列的第k位private static void f(int[] arr, int k) {if (k == 9) { //全部確認check(arr);// print(arr);return;}//選定第k位,for (int i = k; i < arr.length; i++) {//將第i位和第k位交換int t = arr[i];arr[i] = arr[k];arr[k] = t;f(arr, k + 1); // 移交下一層 確認第k+1位//回溯(換回來) 不影響以后的取值//每一次計算, 都用初始值t = arr[i];arr[i] = arr[k];arr[k] = t;}}// private static void print(int[] arr) { // for (int i = 0; i < arr.length; i++) { // System.out.print(arr[i]); // } // System.out.println(); // }//枚舉加號和除號的位置private static void check(int[] arr) {//+前的字符數最多是7for (int i = 1; i <= 7; i++) {int num1 = toInt(arr, 0, i); //+前面的一段整數if (num1 >= N) continue; //如果此時+號前的數值已經超過了N,沒必要驗算了// /前面的字符數for (int j = 1; j <= 8 - i; j++) {int num2 = toInt(arr, i, j);int num3 = toInt(arr, i + j, 9 - i - j);if (num2 % num3 == 0 && num1 + num2 / num3 == N) {ans++;}}}}//pos: 開始計算的位置; len:計算的長度(計算len次) 計算區間: [pos, pos + len -1]private static int toInt(int[] arr, int pos, int len) {int t = 1;int ans = 0;for (int i = pos + len - 1; i >= pos; i--) {ans += arr[i] * t;t *= 10;}return ans;}} /** int num1 = toInt(arr, 0, i); // "+"前面的一段整數 int num2 = toInt(arr, i, j); // "+"與"/"之間的整數 int num3 = toInt(arr, i + j, 9 - i - j); // "/"后面的整數100 = 3 + 69258 / 714 int num1 = toInt(arr, 0, 1); int num2 = toInt(arr, 1, 5); int num3 = toInt(arr, 1 + 5, 9 - 1 - 5);100 = 82 + 3546 / 197 int num1 = toInt(arr, 0, 2); int num2 = toInt(arr, 2, 4); int num3 = toInt(arr, 2 + 4, 9 - 2 - 4);*/【撲克排序】題目詳情
標題:撲克序列
A A 2 2 3 3 4 4, 一共4對撲克牌。請你把它們排成一行。
要求:兩個A中間有1張牌,兩個2之間有2張牌,兩個3之間有3張牌,兩個4之間有4張牌。
請填寫出所有符合要求的排列中,字典序最小的那個。
例如:22AA3344 比 A2A23344 字典序小。當然,它們都不是滿足要求的答案。
請通過瀏覽器提交答案。“A”一定不要用小寫字母a,也不要用“1”代替。字符間一定不要留空格。
答案:2342A3A4
【撲克排序】題目解答
import java.util.HashSet; import java.util.Set;public class Main {static Set<String> set = new HashSet<String>();public static void main(String[] args) {char[] a = {'A', 'A', '2', '2', '3', '3', '4', '4'};f(a, 0);for (String x : set) { // 遍歷set()System.out.println(x);}}private static void f(char[] a, int k) {if (k == a.length) {String s = new String(a);if (check(s)) {// System.out.println(s);set.add(s);}}for (int i = k; i < a.length; i++) {char t = a[k];a[k] = a[i];a[i] = t;f(a, k + 1);t = a[k];a[k] = a[i];a[i] = t;}}private static boolean check(String s) {if (s.lastIndexOf('A') - s.indexOf('A') == 2 && s.lastIndexOf('2') - s.indexOf('2') == 3 && s.lastIndexOf('3') - s.indexOf('3') == 4 && s.lastIndexOf('4') - s.indexOf('4') == 5)return true;return false;} }【湊算式】題目詳情
湊算式
B DEF A + --- + ------- = 10C GHI(如果顯示有問題,可以參見【圖1.jpg】)這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。比如: 6+8/3+952/714 就是一種解法, 5+3/1+972/486 是另一種解法。
這個算式一共有多少種解法?
注意:你提交應該是個整數,不要填寫任何多余的內容或說明性文字。
答案:29
【湊算式】題目解答
public class Main { // 29static int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };static int ans;static boolean check() {int x = a[3] * 100 + a[4] * 10 + a[5];int y = a[6] * 100 + a[7] * 10 + a[8];if ((a[1] * y + a[2] * x) % (y * a[2]) == 0 && a[0] + (a[1] * y + a[2] * x) / (y * a[2]) == 10)return true;return false;}//遞歸回溯生成全排列,適用于無重復元素的情況 考慮第k位,前面已經排定static void f(int k) {if (k == 9) { // 一種排列已經生成if (check())ans++;}// 從k往后的每個數字都可以放在k位for (int i = k; i < 9; ++i) {{int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1); // 遞歸{int t = a[i];a[i] = a[k];a[k] = t;} // 回溯}}public static void main(String[] args) {f(0);System.out.println(ans);} }全排列 模板
package Z;public class 全排列 {public static void main(String[] args) {int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };perm(a, 0, a.length);}public static void perm(int arr[], int start, int end) {if (start == end) {for (int temp : arr) {System.out.print(temp);}System.out.println();} else {for (int i = start; i < arr.length; i++) {swap(arr, start, i);perm(arr, start + 1, end);swap(arr, start, i);}}}public static void swap(int arr[], int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}
總結
以上是生活随笔為你收集整理的Java【全排列 算法 模板】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Studio :1、连接
- 下一篇: 2013 第4届 蓝桥杯 黄金连分数【详