题解 P1706 全排列问题

Posted luckyblock

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 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 全排列问题的主要内容,如果未能解决你的问题,请参考以下文章

洛谷——P1706 全排列问题

洛谷 P1706 全排列问题

洛谷P1706全排列问题

洛谷 P1706 全排列问题(Java版)

P1706 全排列问题

洛谷 P1706 全排列问题