3126 - 重复元素全排列问题

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

设有n个元素要进行全排列,其中可能有相同的元素,例如abcc,设计一个算法,列出n个元素的不同排列。

题目输入

第一行:输入元素的个数n

第二行:输入n个元素

题目输出

输出n个元素的不同不同排列,每个排列一行。

最后一行为排列的个数。

输入/输出样例

输入格式

4
aacc

输出格式

aacc
acac
acca
caac
caca
ccaa
6

C语言解答

#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
#define bool int
#define false 0
#define true 1
int num = 0;
int contains(char str[SIZE], int k, int i)
{	
	for (int j = k; j < i; j++) 
	{               
		if (str[i] == str[j])     
			return true;
    }
	return false;
}
void MySwap(char *a, char *b)
{
	char temp;
	temp= *a;
	*a = *b;
	*b = temp;
}
void Perm(char str[SIZE], int k, int m)
{
	if (k == m)
	{
		for (int i = 0; i <= m; i++)
			printf("%c",str[i]);
		num++;
		printf("\n");
	}
	else 
	{	
		for (int i = k; i <= m; i++)
		{
			if (!contains(str, k, i))
			{
				MySwap(&str[k], &str[i]);
				Perm(str, k+1, m);
				MySwap(&str[k], &str[i]);
			}
		}
		
	}
}
int main()
{	
	int n;
	scanf("%d",&n);
	char s[SIZE];
	scanf("%s", s);
	Perm(s, 0, n-1);
	printf("%d\n",num);
	return 0;
}

C++解答

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

string res[100];
int n;

int swap(char &a, char &b){
	char temp;
	temp = a;
	a = b;
	b = temp;
	
	return 0;
}

void ex(){
	int sum = 0,t = 0,flag = 1;
	string ss[100]={""};

	for(int i = 0; i < n; i++){
		for(int j = t; j >0; j--)
			if(ss[j] == res[i])
				flag = 0;
			if(flag){
				ss[++t] = res[i];
				sum++;
				cout << ss[t] << endl;
			}
			flag = 1;
	}
	cout << sum;
}

int perm(string s, int k, int m){
	if(k == m - 1){
		static int c = 0;
		res[c] = s;
		c++;
		n = c;
	}else{
		for(int i = k; i < m; i++){
			swap(s[k],s[i]);
			perm(s,k+1,m);
			swap(s[k],s[i]);
			}
	}
	return 0;
}

int main(){
	string s;
	int n;
	cin >>n >>s;
	perm(s, 0 ,s.length());
	ex();
return 0;}