题目1120:全排列

题目描述:

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有‘a‘ < ‘b‘ < ... < ‘y‘ < ‘z‘,而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入:

输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出:

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。

样例输入:
abc
样例输出:
abc
acb
bac
bca
cab
cba
提示:

每组样例输出结束后要再输出一个回车。

用的DFS,TLE...

Code:
#include <cstdio>
#include <cstring>

using namespace std;

const int arrSize=10;
char arr[arrSize];
bool mark[arrSize];
char answer[arrSize];
int arrLen=0;

void initMark(bool mark[]){
    for(int cnt=1;cnt<=arrLen;++cnt)
        mark[cnt]=true;          //初始化,设置为均未访问过
}

void DFS(int num){
    if(num==arrLen){
        for(int cnt=1;cnt<=arrLen;++cnt)
            printf("%c",answer[cnt]);
        printf("\n");
        return;
    }
    for(int cnt=1;cnt<=arrLen;++cnt){
        if(mark[cnt]==true){
            mark[cnt]=false;
            answer[num+1]=arr[cnt];
            DFS(num+1);
            mark[cnt]=true;
        }
    }
}

int main()
{
    while(scanf("%s",arr+1)!=EOF){
        arrLen=strlen(arr+1);
        for(int cnt=1;cnt<=arrLen;++cnt){
            initMark(mark);
            answer[1]=arr[cnt];
            mark[cnt]=false;
            DFS(1);
        }
        printf("\n");
    }
    return 0;
}

/**************************************************************
    Problem: 1120
    User: lcyvino
    Language: C++
    Result: Time Limit Exceed
****************************************************************/

改用STL

Code:
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
   const int arrSize=10;
   char arr[arrSize];
   int arrLen;
   while(scanf("%s",arr)!=EOF){
        arrLen=strlen(arr);
        sort(arr,arr+arrLen);
        do{
            printf("%s\n",arr);
        }while(next_permutation(arr,arr+arrLen));
        printf("\n");
   }
   return 0;
}

/**************************************************************
    Problem: 1120
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:350 ms
    Memory:1020 kb
****************************************************************/

时间: 2024-10-22 23:51:10

题目1120:全排列的相关文章

题目1120:全排列(回溯法)

题目链接:http://ac.jobdu.com/problem.php?pid=1120 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1120 全排列.cpp // Jobdu // // Created by PengFei_Zheng on 23/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.

九度 题目1120:全排列

题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入: 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出: 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前面.字母序如下定义: 已知S = s1s2...sk , T = t1t2...tk,则S < T

ACM题目————STL + 全排列

今天碰到一个函数,感觉挺好用的,全排列函数 next_permutation! 他可以遍历全排列哦! 话不多说,直接上题. 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<

1120.全排列

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入: 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出: 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前面.字母序如下定义: 已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在

递归--练习7--noi1750全排列

递归--练习7--noi1750全排列 一.心得 二.题目 1750:全排列 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出 输出这个字符串的所有排列方式,每行一个排列.要求

关于回溯与n个数的全排列

今天要讲的题目是全排列的问题:有1.2.3.....n这样一个数列,要求输出其全排列. 那么,显然,这道题目非常之简单,用一个标志数组变量,标记数字的使用情况,然后根据它挑选数字即可.由于题目很简单,在这就不多说了,来看看代码: 1 #include<stdio.h> 2 int n; 3 int sum=0;//统计方法数 4 int a[10001]={0};//用于储存答案 5 int flag[10001]={0};//所有数字的标志变量初始化为0 6 void out();//函数用

每天一道Rust-LeetCode(2019-06-11)

每天一道Rust-LeetCode(2019-06-02) Z 字形变换 坚持每天一道题,刷题学习Rust. 题目描述 全排列 II 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1]] 解题过程 思路: 因为要穷举结果,所以只能用穷举的办法. 思路: 对于完全不重复的数字,找到所有可能组合的办法: [1] 对于1,2 则是 [2,1] [1,2] 于1,2,3 则是 [3,2,1] [2,3,1

搜索入门练习题3 全组合 题解

题目出处:<信息学奥赛一本通>例5.2. 题目描述 设有 \(n\) 个数的集合 \(\{1,2,...,n\}\) ,从中任意取出 \(r\) 个数进行排列 \((r \le n)\) ,试列出所有的排列. 输入格式 输入包含两个正数 \(n,r(1 \le r \le n \le 10)\) 输出格式 输出从 \(n\) 个数的集合中选出 \(r\) 个数的所有组合,每个组合方案占一行.对于每个组合,按照从小到大的顺序输出组合中的所有元素,两两之间有一个空格分隔. 样例输入 3 2 样例输

[SHOI2013]阶乘字符串

题目描述 给定一个由前\(n\)个小写字母组成的串\(S\). 串\(S\)是阶乘字符串当且仅当前\(n\)个小写字母的全排列(共\(n!\)种)都作为\(S\)的子序列(可以不连续)出现. 由这个定义出发,可以得到一个简单的枚举法去验证,但是它实在太慢了.所以现在请你设计一个算法,在\(1\)秒内判断出给定的串是否是阶乘字符串. 输入格式 输入第\(1\)行一个整数\(T\),表示这个文件中会有\(T\)组数据. 接下来分\(T\)个块,每块\(2\)行: 第\(1\)行一个正整数\(n\),