暴力搜索与进制转换

91 阅读1分钟

暴力搜索如下:

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;
        }
    }

}

例题:www.luogu.com.cn/problem/P17…

题目描述

按照字典序输出自然数 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();
}
//十进制之内