uva 10098 Generating Fast(全排列)

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

贴代码:

<span style="font-family:Courier New;font-size:18px;">#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int cmp(const void *a,const void *b)
{
	return *(char *)a - *(char *)b;
}
int main()
{
		int T;
		char a[15];
		scanf("%d",&T);
		while(T--)
		{
			scanf("%s",a);
			int len = strlen(a);
			qsort(a,len,sizeof(a[0]),cmp);
			puts(a);
			while(next_permutation(a,a+len))
			{
				puts(a);
			}
			puts("");
		}
		return 0;
} </span>

递归:

<span style="font-family:Courier New;font-size:18px;">#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp(const void *a,const void *b)
{
	return *(char *)a - *(char *)b;
}
void solve(int len,char *a,char *b,int cur)
{
	int i,j;
	if(cur == len)
	{
		puts(b);
		return ;
	}
	else
	{
		for(i=0; i<len; i++)
		{
			if(!i||(a[i] != a[i-1]))
			{
				int ans1 = 0, ans2 = 0;
				for(j=0; j<len; j++)	if(a[i] == a[j]) 	ans1++;
				for(j=0; j<cur; j++)	if(b[j]==a[i])		ans2++;
				if(ans2 < ans1)
				{
					b[cur] = a[i];
					solve(len, a, b, cur+1);
				}
			}
		}
	}
	return ;
}
int main()
{
		int T;
		char a[15];
		char b[15];
		scanf("%d",&T);
		while(T--)
		{
			memset(a,'\0',sizeof(a));
			memset(b,'\0',sizeof(b));
			scanf("%s",a);
			int len = strlen(a);
			qsort(a,len,sizeof(a[0]),cmp);
			solve(len,a,b,0);
			puts("");
		}
		return 0;
} </span>
时间: 2024-12-17 22:03:51

uva 10098 Generating Fast(全排列)的相关文章

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

思路:生成全排列,用next_permutation,注意生成之前先对那个字符数组排序. AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; char str[20]; int main() { int n; cin >> n; while(n-

Generating Fast UVA 10098

说说: 这道题的其实就是给你一个字符串,然后输出该字符串所含字符能构成的全部的串,并按字典升序输出.解法的话,无非就是递归实现.先将原字符串排序,然后逐一确定每个位置上的字符.为了防止有重复的字符串出现,每个位置上的字符不能与之前相同.具体的解释请参见刘汝佳的<算法竞赛入门经典>P118,生成可重集的排列. 源代码: #include <stdio.h> #include <string.h> #define MAX 10+5 char s[MAX]; char p[M

uva 140 Bandwidth (全排列+暴力枚举)

uva 140 Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the elements in V, then the bandwidth of a node v is defined as the maximum distance in the ordering between v and any node to which it

uva 10098 生成字典续序列

生成字典续序列. // // main.cpp // 10098_1 // // Created by Fangpin on 15/3/7. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char

Uva 524 相邻素数全排列

传送门:https://vjudge.net/problem/UVA-524 回溯法深搜,我的硬是不知道哪里错了,和别人AC的程序输出一模一样 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 50; int n; int isp[maxn]; int vis[maxn]; int A[maxn] = {1}; void pre()

uva 11925 Generating Permutations

题意: 给定一到n的序列,按照下列规则,将序列排为升序列 1.交换前两个数 2.将最后一个数放在最前面(紫书错了,害惨我了) 数据量为300,刘汝佳提示是最多2*n*n次操作,所以我选择了数组模拟,正常数组无法将最后一个放到前面,所以我将数组倒置 因为没有要求最优解,只要能得到想要的结果就行了,所以采取了构造法 只要在第一个比第二个小,那么就把最后一个放到最前面,否则就交换前两个,这样就可以把大的慢慢往后放,如果n 1的情况,那么就要把最后一个放到最后面,不然就会陷入循环 例如4 2 3 1  

uva10098 Generating Fast, Sorted Permutation

#include"iostream"#include"stdio.h"#include"string.h"#include"algorithm"#include"stdlib.h"using namespace std;char s[100];int main(){ int t; cin>>t; getchar(); while(t--) { scanf("%s",s); s

【UVA】11992 - Fast Matrix Operations(线段树模板)

基本的线段树,需要注意的是由于有set和add操作,懒惰标记下推的时候,优先递推set,之后递推add,每次执行set操作将add标记清0 WA了好几次是因为计算那一段的时候出问题了,可笑的是我对着模板找了一个多小时的错. #include<cstdio> #include<cmath> #include<queue> #include<stack> #include<map> #include<algorithm> using na

UVA 11925 Generating Permutations 生成排列

题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去. 思路有两种: 1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后就可以排序啦. 具体解释可以看SRM 664的C题 2.逆向思考,把给定序列变成有序,操作相应变化一下,最后逆序输出操作. 至于排序的问题,把序列看成一个环,第二种操作相当改变了可交换元素的位置,然后就可以等效为冒泡排序啦... 第二种思路需要注意的一点是,是因为是环状的,和冒泡排序有所区别,最大的