50,549
社区成员
发帖
与我相关
我的任务
分享
package test;
import java.util.ArrayList;
import java.util.List;
public class AllSort {
public static void main(String[] args) {
char buf[] = { '7', '4', '1', '1', '2', '2', '4', '3', '7', '5', '5', '6', '6', '3' };
perm(buf, 2, buf.length - 1);
}
/**
* @param buf
* @param start
* @param end
*/
public static void perm(char[] buf, int start, int end) {
if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
checkNum(buf, end);
} else {// 多个字母全排列
for (int i = start; i <= end; i++) {
char temp = buf[start];// 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp;
perm(buf, start + 1, end);// 后续元素递归全排列
temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}
}
}
private static void checkNum(char[] buf, int end) {
boolean flag = true;
List<Character> tmpList = new ArrayList<>();
for (int i = 0; i <= end; i++) {
char tmp = buf[i];
if (tmpList.contains(tmp)) {
continue;
}
tmpList.add(tmp);
int nextIndex = i + Integer.valueOf(tmp + "") + 1;
if (nextIndex > end || buf[nextIndex] != tmp) {
flag = false;
}
}
if (flag) {
System.out.println(buf);
}
}
}
结果是:
74151643752362
class C {
static void findSo(int[] a, int n) {
for (int i = 0; i < 14; i++) {
if (i + n + 1 < 14 && a[i] == 0 && a[i + n + 1] == 0) {
a[i] = n;
a[i + n + 1] = n;
if (n == 7) {
for (int j = 0; j < 14; j++) {
System.out.print(a[j]);
}
System.out.print("\n");
} else {
findSo(a, n + 1);
}
a[i] = 0;
a[i + n + 1] = 0;
}
}
}
public static void main(String[] args) {
int[] a = new int[14];
findSo(a, 1);
}
}
import java.util.Scanner;
/**
*
* @author Cyl-29
*
*/
/**
* 7对数(1-7),组成一个14位的数.
* 要求两个1之间有1个其他数字,
* 两个2之间有2个其他数字……
* 两个7之间有7个其他数字。
*
* 例子:忘记了 *
* 编程找出74开头的这14位数.
*/
public class Qi {
static int num[] = new int[15];
static int vis[] = new int[8];
static void print(){
for(int i=1; i<15; i++){
System.out.print(num[i]);
}
System.out.println();
//暂停.
Scanner cin = new Scanner(System.in);
cin.nextLine();
}
static void dfs(int begin,int n){
if(begin == n){
print();
}else{
for(int i=7; i>0; i--){
//短路加快程序运行.
if(i==7 && begin<9)
continue;
if(i==4 && begin<7)
continue;
int min = begin-i>0?begin-i:0;
boolean flag = true;
if(i>=3 && i<=6){
for(int j=begin-1; j>min; j--){
if(i==num[j])
flag = false;//
}
}
if(i==1 && num[begin-1]==1)
continue;
if(i==2 && (num[begin-1] == 2 || num[begin-2] == 2) )
continue;
if(flag && vis[i]<2){
vis[i]++;
num[begin] = i;
dfs(begin+1,n);
vis[i]--;
}
}
}
}
public static void main(String []args){
//74开头.
num[1] = 7; num[2] = 4;
//74各使用一次.
vis[7] = 1; vis[4] = 1;
dfs(3,15);
}
}