题解 P1706 【全排列问题】

提供一种基于排序 的 非搜索 做法



思路:

将答案数组进行二分,
以变量 \(nn\) 为界,
前半部分为有序区,后半部分为无序区
对无序区按照字典序进行排序

每次递归,
都循环从无序区中取出元素,
并加入有序区
并将边界后移一位

之后重新对无序区
按照字典序进行排序,
然后将改变后的数组作为参数,
传到下一层递归中

当有序区的长度等于 \(l\) 时,
便找到了一组解,输出即可


附上代码:


#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
int l;
using namespace std;
void p(int nn,char b[10])        //将字符串分为有序区和无序区,以nn为界
{
    for(int i=nn;i<=l;i++)       //从分界线上开始,依次枚举无序区元素
      {
        char c[10];              //储存当前的 字符串
        for(int k=0;k<=9;k++)
          c[k]=b[k];
        swap(c[nn],c[i]);        //令c[nn]等于找到的字符
        if(nn+1<=l)              //边界小于l,则重排序无序区
          sort(c+(nn+1),c+l+1);
        if(nn==l)                //若到达尾部,则输出
          {
            for(int j=0;j<=l;j++)
              printf("%5c",c[j]);//输出坑点
            printf("\n");
          }
        else
          p(nn+1,c);             //继续找下一个
      }
}
char a[10];
int b;
int main()
{
    cin>>b;
    for(int i=0;i<b;i++)//初始化答案数组
      a[i]=i+'1';
    l=strlen(a)-1;
    p(0,a);
}


题解 P1706 【全排列问题】

原文地址:https://www.cnblogs.com/luckyblock/p/11456395.html

时间: 2024-07-30 16:35:57

题解 P1706 【全排列问题】的相关文章

洛谷——P1706 全排列问题

P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 输入输出样例 输入样例#1: 复制 3 输出样例#1: 复制 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 恶心的·输出 #include<cstdio> #include<cstring> #in

luogu P1706全排列问题

题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 题解 这题真是道好题,用STL的好题 正常的题解是这样的(我同学的qwq) #include<iostream> #include<iomanip> using namespace std; int n; int a[10001]; bool b[

洛谷 P1706 全排列问题

题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 输入输出样例 输入样例#1: 3 输出样例#1: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1代碼實現: #include<cstdio>int n,s[12];bool v[12];void qpl(int x){ if(x==n)

P1706 全排列问题

题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 输入输出样例 输入样例#1: 3 输出样例#1: 1    2    3    1    3    2    2    1    3    2    3    1    3    1    2    3    2    1 代码如下: 1 #include<io

luogu P1706 全排列问题

1 #include <iostream> 2 using namespace std; 3 int vis[10],ans[10],n; 4 void f(int x) 5 { 6 if (x == n + 1) 7 { 8 for (int i = 1;i <= n;i++) 9 cout << " " << ans[i]; 10 cout << endl; 11 return; 12 } 13 for (int i = 1;i

洛谷——基础搜索

1.P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 输入输出样例 输入样例#1: 3 输出样例#1: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 (⊙v⊙)嗯~ 代码: #include<iostream> #include<cstdio> #

【基础练习】codevs1294 全排列题解

惊奇的发现我竟然没写过这个 粘了黄学长的代码 因为所有的递归全排列拥有共同的灵魂 我经常犯得错误是把取消标记放到循环外 至今没开博的查查比君纠正过很多次 所以记住一定递归后马上取消标记 --水茫茫,平沙雁,旋惊散.

搜索入门练习题2 全排列 题解

题目出处:课程=>搜索1=>题目A 题目描述 给定一个正整数 \(n\) ,按照递增顺序打印数字 \(1\) 到 \(n\) 的所有排列. 输入格式 一个整数 \(n(1 \le n \le 7)\) . 输出格式 按照递增顺序输出 \(n\) 个数的所有排列,每行代表一组排列, \(n\) 个数两两之间有一个空格分隔. 样例输入 3 样例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 问题分析 这是一道搜索的题目. 我们知道搜索就是状态到状态之间的转换,其本质是

Topcoder SRM625 题解

给出一个字符串求是palindrome和anagram的比率是多少. 知识点: 1 DBL_MAX 64位double的最长数大概是1.7E308,很大很大,比long long大上不知多少倍,故此大概能容纳150!的数值,不能容纳200!的数值 2 偶数的时候,不能有字母重复为基数次,否则不能组成palindrome 3 基数的时候,只能有且只有有一个字母重复为基数次,用于放在中间的,否则也不能组成palindrome 4 计算带重复数的全排列公式:P(N) / P(M1)/P(M2)...P