中易网

java中,用递归方法求n个数的无重复全排列,n=3。

答案:2  悬赏:70  
解决时间 2021-04-10 21:08
求给程序最好有注释,涉及的类和功能模块及其算法说明,类之间的关系。谢谢大神
最佳答案
程序如下所示,输入格式为:
5
3 1 2 1 2第一行是数字个数,第二行有n个数,表示待排列的数,输入假设待排序的数均为非负数。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static final int maxn = 1000;
    int n;            // 数组元素个数
    int[] a;        // 数组

    boolean[] used;    // 递归过程中用到的辅助变量,used[i]表示第i个元素是否已使用
    int[] cur;        // 保存当前的排列数

    // 递归打印无重复全排列,当前打印到第idx位
    void print_comb(int idx) {
        if(idx == n) {    // idx == n时,表示可以将cur输出
            for(int i = 0; i < n; ++i) {
                if(i > 0) System.out.print(" ");
                System.out.print(cur[i]);
            }
            System.out.println();
        }

        int last = -1;                            // 因为要求无重复,所以last表示上一次搜索的值
        for(int i = 0; i < n; ++i) {
            if(used[i]) continue;

            if(last == -1 || a[i] != last) {    // 不重复且未使用才递归下去
                last = a[i];
                cur[idx] = a[i];

                // 回溯法
                used[i] = true;
                print_comb(idx + 1);
                used[i] = false;
            }
        }
    }

    public void go() throws FileNotFoundException
    {
        Scanner in = new Scanner(new File("data.in"));

        // 读取数据并排序
        n = in.nextInt();
        a = new int[n];
        for(int i = 0; i < n; ++i) a[i] = in.nextInt();
        Arrays.sort(a);

        // 初始化辅助变量并开始无重复全排列
        cur = new int[n];
        used = new boolean[n];
        for(int i = 0; i < n; ++i) used[i] = false;
        print_comb(0);
        in.close();
    }

    public static void main(String[] args) throws FileNotFoundException{
        new Main().go();
    }
}客观来说,非递归的无重复全排列比较简单且高效。
全部回答
#include<stdio.h> #include<string.h> #define n 10 char s[n], t[n]; void convert(char *strsource, char *strtarget, int nlen) {     int i, j;     char strconvert[10];     if(nlen == 1) {         strtarget[0] = strsource[0];         printf("%s\n", t);         return;     }     else {         for(i=0; i<nlen; i++) {             for(j=0; j<i && strsource[i] != strsource[j]; j++);             if(j == i) {                 strtarget[0] = strsource[i];                 memcpy(strconvert, strsource, i);                 memcpy(strconvert+i, strsource+i+1, nlen-i-1);                 convert(strconvert, strtarget+1, nlen-1);             }         }     } } void main() {     int n; printf("输入一个三位数:");     scanf("%d", &n);     sprintf(s, "%d", n);     memset(t, 0, n); printf("全排列是:\n");     convert(s, t, strlen(s)); }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么制作自己的按键精灵?
dozen“一打”中的“打”的读音是???
UTI,什么公司,谁知道么?
QQ飞车使用功能道具一般获得多少的消费卷奖励
古冶有要做兼职的吗
局域网内怎样控制别人电脑的流量?
拿得起,就应该放得下吗
皮衣淋到雨需要保养吗?
仙桃源丹竹头工业区在什么地方啊,我要过去处
北京的娶个外地媳妇户口怎么办
怎么才能慧眼识人,看清身边的人。
鸡蛋清睫毛膏怎么做?
诗名里带济字的诗词有哪些
山西省临汾市襄汾县有焦化厂吗
U盘插入电脑之后显示:是否格式化。点击确认
推荐资讯
4399勇者之路2加强版魔魂怎么得
目前最流行的计算机编程语言是什么?
有一首中文歌,旋律跟日文歌《烟》一样的
“夕”子的日文怎么写啊?
《巨鹿之战》 之解释及帮助。
地形名称有那些?
中老年人经常腿疼何医?
暗黑破坏神2的石冢到底在哪....我把地图找遍
我在安宁、要去红古,不到海石湾,麻烦兰州各
我们嫁的意大利人 片尾曲
东黄线/四通路(路口)怎么去啊,有知道地址的
男朋友不理你,这是什么意思呢?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?