1908 - 有重复元素的排列问题

通过次数

0

提交次数

0

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


设<span>R={r<sub>1</sub>, r<sub>2 </sub>,…, r<sub>n</sub>}</span>是要进行排列的<span>n </span>个元素。其中元素 <span>r<sub>1</sub>,

r2 ,…, rn可能相同。试设计

一个算法,列出<span>R </span>的所有不同排列。<span> </span> 

<br />

<span></span><span> </span> 

<span>&nbsp;</span> 

编程任务:<span> </span> 

给定<span>n </span>以及待排列的<span>n </span>个元素。计算出这<span>n </span>个元素的所有不同排列。<span> </span> 

题目输入

输入的第1 行是元素个数n1<=n<=500。接下来的1

是待排列的n 个元素。

题目输出

程序运行结束时,将计算出的n 个元素的所有不同排列输出。

最后1 行中的数是排列总数。

输入/输出样例

输入格式

4
aacc

输出格式

aacc
acac
acca
caac
caca
ccaa
6

C语言解答

#include <stdio.h>
#define max 500
 int  count=0;
int repeat(char str[],int a ,int b )
 {
  int i;
          if(b>a)
           for(i=a;i<b;i++)
              if(str[i]==str[b])
                  return 0;
           return 1;
}


 void perm(char str[],int k,int m)
 {
           int i;
           if(k==m)
           {
              count++;
              for(i=0;i<=m;i++)
                  printf("%c",str[i]);
              printf("\n");
              return ;
           }
           else for(i=k;i<=m;i++)
                   if(repeat(str,k,i))
                   {
                          char t;
						  t=str[i];
						  str[i]=str[k];
						  str[k]=t;
                           perm(str,k+1,m);
                           t=str[i];
						   str[i]=str[k];
						  str[k]=t;
                   }
   
 }
 int main()
 {
      char str[max];
      int n,i;
	  scanf("%d",&n);
      getchar();
      for(i=0;i<n;i++)
          scanf("%c",&str[i]);
      perm(str,0,n-1) ;
      printf("%d\n",count);
      return 0;
 }

C++解答

#include <iostream>

#include <algorithm>

using   namespace std ;

long ans ;

int ok(char str[],int a ,int b )

{

        if( b > a)

         for(int i = a ; i< b ; i++)

                 if( str[i] == str[b] )

                         return 0 ;

         return 1 ;

}

void perm(char str[],int k ,int m)

{

         int i ;

         if( k == m )

         {

                 ans ++ ;

                 for( i = 0 ;i <= m ;i++ )

                 {

                         cout<<str[i];

                 }

                 cout<<endl;

         }

         else  

    for( i = k ; i <= m ;i++)

                 if( ok(str,k,i) )

                 {

                         swap ( str[k],str[i] );

                         perm(str, k+1 , m );

                         swap(str[k],str[i] ) ;

                 }

         

}

int main(int argc, char* argv[])

{

   char str[1000];

   int n , i ;

   cin>>n ;

    ans = 0 ;

    for( i = 0 ; i < n ;  i ++)

  cin>>str[i];

    perm(str,0,n-1) ;

    cout<<ans<<endl;

         return 0;

}

Java解答



import java.awt.List;
import java.util.Scanner;

/**
 *
 * @author wanshuzhen
 */ 

public class Main {
    public static int ans=0;
    public static void main(String[] args)
    {
       
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        char [] list = new char[n];
        list = sc.next().toCharArray();
        perm(list, 0, n-1);
       // System.out.print("输出序列为:");
        System.out.println(ans);
    }
    public static void perm(char []list ,int k, int m)
    {
        if(k==m)
        {
            ans++;
            for (int i=0;i<=m;i++){
                System.out.print(list[i]);
            }
            System.out.println();
        }
        else{
            for(int i=k;i<=m;i++)
                if(ok(list,k,i)){
                    swap(list,k,i);
                    perm(list, k+1, m);
                    swap(list,k,i);
                }
        }
    }
    public  static boolean ok(char []list,int k,int i){
        if(i>k)for(int t=k;t<i;t++)if(list[t]==list[i])return false;
        return true;
    }
    public static  void swap(char []list ,int i,int j){
        char temp;
        temp= list[i];
        list[i]=list[j];
        list[j]=temp;
        
    }
}