这道题要求按字典序生成字符串的全排列,不可重复(但字符可以重复,且区分大小写)。

基本思路是先对输入的字符串按字典序排序,然后从第一位开始递归,从所有输入的字符中选出一个填充,然后再选第二位......具体实现看代码。

要注意的是最后的输出方式,不小心的话会莫名其妙的WA,详情见代码。

我的解题代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std; char s[15],ss[15];
int N; int cmp(const void *a, const void *b)
{
return *(char *)a-*(char *)b;
} void print_permutation(int cur, int len)
{
if(cur==len) //满足此条件则ss已经填满,输出
{
for(int i=0; i<len; i++) cout << ss[i]; cout << endl; //这里用cout << ss << endl; 提交就WA了,天知道怎么回事 = - =
return ;
}
for(int i=0; i<len; i++) if(!i || s[i]!=s[i-1]) //判断是否与上一个待选字符是相同的,如果相同就跳过
{
int c1=0,c2=0;
for(int j=0; j<len; j++) if(s[j]==s[i]) c1++;
for(int j=0; j<cur; j++) if(ss[j]==s[i]) c2++;
if(c2<c1) //分别对s和ss中s[i]出现的次数计数,只要c2<c1,就还可以使用s[i]放入ss中
{
ss[cur]=s[i];
print_permutation(cur+1,len);
}
}
} int main()
{
cin >> N;
while(N--)
{
cin >> s;
int len = strlen(s);
qsort(s,len,sizeof(char),cmp); //按字典序对s排序
print_permutation(0,strlen(s));
cout << endl;
}
return 0;
}

UVa 10098: Generating Fast的更多相关文章

  1. UVA 10098 Generating Fast, Sorted Permutation

    // 给你字符串 按字典序输出所有排列// 要是每个字母都不同 可以直接dfs ^_^// 用前面说的生成排列算法 也可以直接 stl next_permutation #include <io ...

  2. (组合数学3.1.1.2)UVA 10098 Generating Fast(使用字典序思想产生所有序列)

    /* * UVA_10098.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> # ...

  3. UVA - 10098 - Generating Fast (枚举排列)

    思路:生成全排列,用next_permutation.注意生成之前先对那个字符数组排序. AC代码: #include <cstdio> #include <cstring> ...

  4. uva 10098 Generating Fast(全排列)

    还是用的两种方法,递归和STL,递归那个是含有反复元素的全排列,这道题我 没有尝试没有反复元素的排列,由于从题目上并没有发现一定是有反复元素的() 贴代码: <span style=" ...

  5. UVA 10098 用字典序思想生成所有排列组合

    题目: Generating permutation has always been an important problem in computer science. In this problem ...

  6. uva10098 Generating Fast, Sorted Permutation

    #include"iostream"#include"stdio.h"#include"string.h"#include"alg ...

  7. UVA 11925 - Generating Permutations

    题意: 给出一个1到n的排列,给出操作顺序,使升序排列能变为所给排列. 分析: 正常冒泡排序的想法.如果前两个数,前面的大于后面的,则换(特例是n,1不能换).否则,就用2的逆操作,把最后的数放前面. ...

  8. UVA - 11992:Fast Matrix Operations

    线段树,注意tag优先级 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cs ...

  9. UVa 11925 Generating Permutations (构造法)

    题意:给定一个序列,让你从一个升序列变成该序列,并且只有两种操作,操作1:交换前两个元素,操作2:把第一个元素移动到最后. 析:一开始的时候吧,不会,还是看的题解,首先是要逆序来做,这样可能好做一点, ...

随机推荐

  1. 文字列表无缝向上滚动JavaScript代码

    <!DOCTYPE html> <html> <head> <meta charset=utf-> <title>文字列表无缝向上滚动Jav ...

  2. sunJCE or ibmJce,was服务器下使用des的注意点

    最近开发了一个应用,在tomcat下一切ok,到was上有报错. 打开debug日志,没有异常?? 继续调查发现是我们的程序引用了一个sun很久以前的jar.这个jar需要单独打开message日志 ...

  3. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  4. 简单DOS命令实现局域网Windows远程关机

    1秒内重启局域网内计算机名为ppgsvr-pc的用户电脑shutdown -r -m \\ComputerName -t 1 1秒内关闭局域网内ppgsvr用户电脑shutdown -s -m \\C ...

  5. Android 之 Spinner

    1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  6. Android的两种菜单

    Android子菜单和选项菜单与上下文菜单的实现 菜单在Android开发中必不可少,可是要怎么实现各种菜单呢?是不是很头疼呢?下面我就来介绍一下: 1. 选项菜单和子菜单的实现 选项菜单:最常规的菜 ...

  7. Microsoft Visual Studio 6.0 Enterprise Edition

    我们的老古董啊  啊啊啊 啊啊 <Microsoft Visual Studio 6.0 Enterprise Edition>(完整9CD,带中文MSDN&   <Micr ...

  8. C# 创建Excel并写入内容

            1 增加应用      Microsoft.Office.Interop.Excel         2 引用命名空间  using Excel = Microsoft.Office. ...

  9. 动态共享库(so)开发精悍教程

    动态共享库(so)开发精悍教程 翻译并根据实际情况进行了小小修改,仅关注Linux下动态共享库(Dynamic shared library .so)的开发. 1 简单的so实例 源文件 //test ...

  10. Android中ListView通过BaseAdapter实现数据的绑定

    1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...