东方博宜OJ 1654:全部排列问题 ← 递归 + 各位可重复

【题目来源】
https://oj.czos.cn/p/1654

【题目描述】
输入 n 输出 1...n 个数的全部排列。全部排列中,数字可以重复。
例如输入 3,输出全部排列的结果如下:111、112、113、121、122、123、131、132、133、211、212、213、221、222、223、231、232、233、311、312、313、321、322、323、331、332、333。

【输入格式】
一个整数 n(1<n≤6)。

【输出格式】
按照由小到大的顺序输出 1…n 这 n 个数的全部排列情况。

【输入样例】
2

【输出样例】
11
12
21
22

【数据范围】
1<n≤6

【算法分析】
● 各位不可重复的全排列问题(https://blog.csdn.net/hnjzsyjyj/article/details/148295326)的代码如下所示。

#include <bits/stdc++.h>
using namespace std;

const int N=10;
int a[N],st[N];
int n;

void dfs(int pos) {
    if(pos==n+1) {
        for(int i=1; i<=n; i++) {
            cout<<a[i];
        }
        cout<<endl;
        return;
    }

    for(int i=1; i<=n; i++) {
        if(st[i]==0) {
            a[pos]=i;
            st[i]=1;
            dfs(pos+1);
            st[i]=0;
        }
    }
}

int main() {
    cin>>n;
    dfs(1);
    return 0;
}

/*
in:
2

out:
11
12
21
22
*/


【算法代码】
● 本题是各位可重复的全排列问题,代码更短。如下所示。

#include <bits/stdc++.h>
using namespace std;

const int N=10;
int a[N];
int n;

void dfs(int pos) {
    if(pos==n+1) {
        for(int i=1; i<=n; i++) {
            cout<<a[i];
        }
        cout<<endl;
        return;
    }

    for(int i=1; i<=n; i++) {
        a[pos]=i;
        dfs(pos+1);
    }
}

int main() {
    cin>>n;
    dfs(1);
    return 0;
}

/*
in:
2

out:
11
12
21
22
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/148295326



 

posted @ 2026-05-22 06:14  Triwa  阅读(18)  评论(0)    收藏  举报