package com.leex.suanfa; import java.util.ArrayList; public class Sf150802 { /** * 保存10! */ static ArrayList<String> list = new ArrayList<>(); public static void main(String[] args) { int count = 0; Sf150802.perm(10); System.out.println(list.size()); for (int i = 0; i < list.size(); i++) { if(check(list.get(i))){ System.out.println(list.get(i)); count ++; } } System.out.println(count); } public static void perm(int N) { int[] p = new int[N]; // permutation int[] pi = new int[N]; // inverse permutation int[] dir = new int[N]; // direction = +1 or -1 for (int i = 0; i < N; i++) { dir[i] = -1; p[i] = i; pi[i] = i; } perm(0, p, pi, dir); } public static void perm(int n, int[] p, int[] pi, int[] dir) { if (n >= p.length) { String tmp = ""; for (int i = 0; i < p.length; i++) { tmp += p[i]; } list.add(tmp); return; } perm(n+1, p, pi, dir); for (int i = 0; i <= n-1; i++) { int z = p[pi[n] + dir[n]]; p[pi[n]] = z; p[pi[n] + dir[n]] = n; pi[z] = pi[n]; pi[n] = pi[n] + dir[n]; perm(n+1, p, pi, dir); } dir[n] = -dir[n]; } /** * 检查 字符串 是否符合要求 * @param str * @return */ public static boolean check(String str) { char[] c = str.toCharArray(); for (int i = 0; i < 10; i++) { int x = c[i]; int y = (i == 9) ? c[0] : c[i+1]; if(x % 2 == 0) { if(y % 2 != 0 && y != x + 1) { return false; } } else { if(y % 2 == 0 && y != x - 1) { return false; } } } return true; } }