2 条题解

  • 4
    @ 2024-1-24 12:49:13
    ● 引言:
    STL

    STL(Standard Template Library),即 标准模板库,是一个具有工业强度的、高效的C++程序库,内部包含了许多常用算法模板。

    STL 全排列函数 next_permutation()

    包含于头文件<algorithm>,将数字类型数据按照字典序全排列。

    基本格式:

    int a[n];
    do{
        //代码块
    } while(next_permutation(a, a+n));
    

    WARNING:

    1. next_permutation() 函数作用范围:自数组当前字典序始依次增大至最大字典序

      eg.

      int a[3]={1, 0, 2};
      do{
           for(int i=0; i<n; i++) printf("%d ", a[i]);
           printf("\n");
      } while(next_permutation(a, a+3));
      

      输出:

      1 0 2

      1 2 0

      2 0 1

      2 1 0

      int a[3]={1, 0, 2};
      sort(a, a+3);
      do{
          for(int i=0; i<n; i++) printf("%d ", a[i]);
          printf("\n");
      } while(next_permutation(a, a+3));
      

      输出:

      0 1 2

      0 2 1

      1 0 2

      1 2 0

      2 0 1

      2 1 0

    2. next_permutation() 属于原地算法,会直接更新数组的值。如果“下一个排列”存在,函数返回true并执行排列,否则返回false

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int main(){
        char s[10];
        scanf("%s", s);
    
        int const n=strlen(s);
    
        int t[10];
        for(int i=0; i<n; i++) t[i] = i;
    
        do{
            for(int i=0; i<n; i++) printf("%c ", s[t[i]]);
            printf("\n");
        } while(next_permutation(t, t+n));
    
        return 0;
    }
    
    • 0
      @ 2022-11-15 20:39:46
      #include<cstdio>
      #include<cstring>
      using namespace std;
      char s[11]; //输入的字符串 
      char a[11]; //生成的序列 
      bool f[11];	//记录状态,初始状态默认为false 
      int len;	//记录字符串的长度 
      void print()  //输出生成的序列 
      {
      	for(int i=1;i<len;i++)
      		printf("%c ",a[i]);//每两个数之间有空隔 
      	printf("%c\n",a[len]);//每行最后一个数 
      }
      void find(int x)
      {
      	if(x>len) print();//边界条件 
      	else
      	{
      	 	for(int i=0;i<len;i++) //字符串从0位开始数 
      		 if(f[i]==false)
      		{
      		   	a[x]=s[i];//用a数组记录每一位 
      			f[i]=true;//第i位调用过就记为true 
          		find(x+1);//递归调用 
          		f[i]=false;//恢复现场 
      		}
      	}	
      }
      int main()
      {
      	scanf("%s",&s);//读入字符串 
      	len=strlen(s);//求字符串长度 
      	find(1);	//搜索 
      	return 0;
      }
      
      • 1

      信息

      ID
      419
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      87
      已通过
      36
      上传者