暴力搜索如下:
import java.util.ArrayList;
import java.util.List;
public class SouSuo {
static List<List<Integer>> list = new ArrayList<>();
public void dfs(int n, int []v , List<Integer>t){
if (t.size()==n){
list.add(new ArrayList<>(t));
return;
}
for (int i = 1;i<=n;i++){
if (v[i]==1)//v[i]==1表示当前数字已经排过
continue;
v[i]=1;
t.add(i);
dfs(n,v,t);//搜索下一个状态
t.remove(t.size()-1);//回撤状态
v[i]=0;
}
}
}
题目描述
按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。
输出格式
由 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
输入
3
输出
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
个人解答:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static List<List<Integer>> list = new ArrayList<>();
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] v = new int[n + 1];
List<Integer> t = new ArrayList<>();
dfs(n, v, t);
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).size(); j++) {
System.out.print(" " + list.get(i).get(j));
}
System.out.println();
}
}
public static void dfs(int n, int[] v, List<Integer> t) {
if (t.size() == n) {
list.add(new ArrayList<>(t));
return;
}
for (int i = 1; i <= n; i++) {
if (v[i] == 1)
continue;
v[i] = 1;
t.add(i);
dfs(n, v, t);
t.remove(t.size() - 1);
v[i] = 0;
}
}
}
进制转换其实就是我们前几周的蓝桥小题中哈沙德数的方法总结:
String str = Integer.toString(x,y)
//x为十进制数,y是所需转换之后的进制,返回值是字符串,如果是16进制是小写字母
public static String jzzh(x,y){
StringBuilder str = new StringBuilder();
while(x>0){
str.append(x%y);
x/=y;
}
return str.reverse().toString();
}
//十进制之内