2015-06-04

问题简述:

  输出一串字符的全排列,顺序不同于一般的字母序,而是 A<a<B<b......<Z<z。所以应该重写一个比较函数。

  原题链接:http://poj.org/problem?id=1256

解题思路:

  两种方法:

  方法一:简单的深搜 DFS 搜索所有的可能,但是要注意几个连续相同的字符算作一种情况。

  方法二:使用 STL 的 next_permutation 函数可以很方便的生成全排列。

      关于 next_permutation 函数,可以参考:姜南(Slyar)的文章(点击直接跳转) 感谢原作者!

DFS源代码:

  /*
OJ: POJ
ID: 3013216109
TASK: 1256.Anagram
LANG: C++
NOTE: DFS
*/
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std; int n;
char str[],ans[];
int visited[]; bool cmp(char a,char b) {
if(tolower(a)==tolower(b))
return a<b;
else
return tolower(a)<tolower(b);
} void dfs(int t) {
if(t==strlen(str)) {
for(int i=;i<t;i++)
printf("%c",ans[i]);
printf("\n");
return;
}
for(int i=;i<strlen(str);i++) {
if(!visited[i]) {
ans[t]=str[i];
visited[i]=;
dfs(t+);
visited[i]=;
while(i+<strlen(str)&&str[i]==str[i+]) i++;
}
}
} int main()
{
scanf("%d",&n);
getchar();
while(n--) {
memset(visited,,sizeof(visited));
gets(str);
sort(str,str+strlen(str),cmp);
dfs();
}
return ;
}

STL源代码:

  /*
OJ: POJ
ID: 3013216109
TASK: 1256.Anagram
LANG: C++
NOTE: NEXT_PERMUTATION
*/
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std; int n;
char str[]; bool cmp(char a,char b) {
if(tolower(a)==tolower(b))
return a<b;
else
return tolower(a)<tolower(b);
} int main()
{
scanf("%d",&n);
getchar();
while(n--) {
gets(str);
sort(str,str+strlen(str),cmp);
do {
puts(str);
} while(next_permutation(str,str+strlen(str),cmp));
}
return ;
}

POJ 1256.Anagram的更多相关文章

  1. poj 1256 Anagram(dfs)

    题目链接:http://poj.org/problem?id=1256 思路分析:该题为含有重复元素的全排列问题:由于题目中字符长度较小,采用暴力法解决. 代码如下: #include <ios ...

  2. poj 1256 Anagram—next_permutation的神奇应用

    题意:给你一条字符串,让你输出字符串中字符的全排列,输出的顺序要按它给的奇葩的字典序. 题解:要输出全排列,暴力dfs可以过,但要注意题目的字典序以及相同字符的情况.如果用next_permutati ...

  3. poj 2408 Anagram Groups(hash)

    id=2408" target="_blank" style="">题目链接:poj 2408 Anagram Groups 题目大意:给定若干 ...

  4. POJ 1256:Anagram

    Anagram Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18393 Accepted: 7484 Description ...

  5. POJ 2408 - Anagram Groups - [字典树]

    题目链接:http://poj.org/problem?id=2408 World-renowned Prof. A. N. Agram's current research deals with l ...

  6. 1256 Anagram

    题目链接: http://poj.org/problem?id=1256 题意: 根据自定义的字典序: 'A'<'a'<'B'<'b'<...<'Z'<'z' 和输 ...

  7. next_permutation,POJ(1256)

    题目链接:http://poj.org/problem?id=1256 解题报告: 1.sort函数是按照ASC11码排序,而这里是按照 'A'<'a'<'B'<'b'<... ...

  8. poj 2408 Anagram Groups

    Description World-renowned Prof. A. N. Agram's current research deals with large anagram groups. He ...

  9. 【字母全排列】 poj 1256

    深搜   注意与STL模版的去重函数唯一的区别就是有去重. #include <iostream> #include <cstdio> #include <string. ...

随机推荐

  1. 转: mysql create view 创建视图

    以下的文章主要是对MySQL视图的描述,其中包括MySQ视图L概述,以及创建MySQL视图-create view与修改MySQL视图--alter view等相关内容的具体描述,以下就是文章的具体内 ...

  2. php 配置文件

    <?php return array( 'TMPL_L_DELIM'=>'<{', //配置左定界符 'TMPL_R_DELIM'=>'}>', //配置右定界符 'DB ...

  3. 在 Visual C++ 中开发自定义的绘图控件

    本文讨论的重点介于两者 之间 — 公共控件赋予您想要的大部分功能,但控件的外观并不是您想要的.例如,列表视图控件提供在许多视图风格中显示数据列表的方式 — 小图标.大图标.列表和详细列表(报告).然而 ...

  4. cocos2d-x过程动作CCProgressTo示例学习笔记

    // // SpriteProgressToRadial // //------------------------------------------------------------------ ...

  5. QVector 和vector的比较

    QVector和vector的比较: Qvector默认使用隐式共享,可以用setSharable改变其隐式共享.使用non-const操作和函数将引起深拷贝.at()比operator[](),快, ...

  6. 去掉android的屏幕上的title bar

    在配置文件里修改 (关键代码:android:theme="@android:style/Theme.NoTitleBar.Fullscreen",如果想只是去除标题栏就后面不用加 ...

  7. android技术牛人的博客[转]

    Android+JNI调用–文件操作 开发环境:Windows xp sp3 +MyEclipse 8.6+android2.3.3+jdk1.6+android-ndk-r6b JNI概述:     ...

  8. 记userscripts.org

    发现一些Firefox用户脚本不起作用,userscripts.org访问不能有一个很长的一段时间,我还以为出了什么问题没出去检查.前几天有时间检查脚本,在路上,然后返回到userscripts.or ...

  9. sql--关于exec和sp_execute

    sql:exec与sp_excutesql的比较 exec与sp_execute都可以执行存储过程和批处理动态sql语句,以下所属均是关于批处理动态sql语句方面. 一.关于输入参数与输出参数 1.使 ...

  10. BZOJ 1050 旅行comf

    题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...