【字母全排列】 poj 1256

深搜   注意与STL模版的去重函数唯一的区别就是有去重。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int len;
char ch[15],ss[15];
int visted[15];
bool cmp(char a,char b)
{
    double t1=a,t2=b;
    if(a>=‘A‘&&a<=‘Z‘) t1+=31.5; //神来之笔,对于cmp的神级处理
    if(t2>=‘A‘&&t2<=‘Z‘) t2+=31.5;
    return t1<t2;
}

void dfs(int x)
{
    if(x==len)
    {
        for(int i=0;i<len;++i)
        printf("%c",ch[i]);
        printf("\n");
    }
    else
    {
        for(int i=0;i<len;i++)  //以任意顺序开头
        {
            if(!visted[i])
            {
                ch[x]=ss[i];
                visted[i]=1;
                dfs(x+1);
                visted[i]=0; //另一进程需要更新dfs之前的值
                while(i+1<len&&ss[i+1]==ss[i])i++;  //去重
            }
        }
    }
}

int main()
{
    //freopen("in.txt","r",stdin);
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        memset(visted,0,sizeof(visted));
        scanf("%s",ss);
        len=strlen(ss);
        sort(ss,ss+len,cmp);
        dfs(0);
    }
    return 0;
}

网上看到的一段代码:

用的是STL的库函数next_permutation全排列

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

bool cmp(char a,char b)
{
if(tolower(a)==tolower(b))
return a<b;
else
return tolower(a)<tolower(b);
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string str;
        cin>>str;
        sort(str.begin(),str.end(),cmp);
        do
        {
            cout<<str<<endl;
        }
        while(next_permutation(str.begin(),str.end(),cmp));
    }
    return 0;
}
时间: 2024-12-30 12:20:06

【字母全排列】 poj 1256的相关文章

[2016-01-19][POJ][1256]

时间:2016-01-19  13:41:17  星期二 题目编号:POJ 1256 题目大意:给出一个word,求word组成字母的全排列,并输出 要求 输出顺序按字母顺序 字母顺序为 'A'<'a'<'B'<'b'<...<'Z'<'z' 方法: 通过上面的字母顺序构造一个cmp函数 先对原来的word进行重新排序 然后 用 next_permutation 进行生成后续排列,边生成边输出即可 解题过程遇到问题: next_permutation() 有第三个参数 

poj 1256 按一定顺序输出全排列(next_permutation)

Sample Input 3aAbabcacbaSample Output AabAbaaAbabAbAabaAabcacbbacbcacabcbaaabcaacbabacabcaacabacbabaacbacabcaacaabcabacbaa 对字符串进行全排列,字符的大小规则: 'A'<'a'<'B'<'b'<...<'Z'<'z'. 1 # include <iostream> 2 # include <cstring> 3 # inclu

poj 1256 Anagram

题目链接:http://poj.org/problem?id=1256 思路:     该题为含有重复元素的全排列问题:由于题目中字符长度较小,采用暴力法解决. 代码如下: #include <iostream> #include <algorithm> using namespace std; const int MAX_N = 20; char P[MAX_N], A[MAX_N]; char * SortAlp( char P[], int n ) { int Low[MAX

next_permutation,POJ(1256)

题目链接:http://poj.org/problem?id=1256 解题报告: 1.sort函数是按照ASC11码排序,而这里是按照 'A'<'a'<'B'<'b'<...<'Z'<'z'排序. #include <iostream> #include <algorithm> #include <string> using namespace std; bool cmp(char a,char b) { char m=tolowe

ybt 1199字母全排列

全排列 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 151     通过数: 111  [题目描述] 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' <'b' < ... <'y'<'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. [输入] 只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. [输出] 输出这个字符串的所有排列方式,每行一个排列.要求字母序

7 POJ 1256 Anagram

给一个字符串包含大小写字符,规定'A'<'a'<'B'<'b'<...<'Z'<'z',求该字符串的全排列. 用裸的dfs+map判重 写了一遍超时了,那种机智的dfs方法没有怎么看懂.. 最开始用的set+next_permutation,太年轻,也超时了... 运用一个next_permutation()函数即可,<algorithm>头文件 注意要先将字符串sort一遍,然后next_permutation()也要把比较函数cmp传进去,原来都不知道可

POJ 1256:Anagram

Anagram Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18393 Accepted: 7484 Description You are to write a program that has to generate all possible words from a given set of letters. Example: Given the word "abc", your program shoul

POJ 1256 Anagram(输入可重集枚举排序)

[题意简述]:本题题意很好理解!题目给出的Hint,使我们对关键点有了更加清晰的认识 An upper case letter goes before the corresponding lower case letter. So the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'. 就是给一个序列(序列可以有重复的元素),让我们输出它的所有排列,字母顺序规定给出! [分析]:这道题是我之前学习枚举排序和子

WLLCM这五个字母全排列数目

       经过训练的话一眼看出来是5!/2!:我想的是先排WLCM那么是4!,5个位置,由于L左右两边的位置其实是一样的(再插入的还是L),索以结果是4*4!,这样重复了,看下图.