现在的位置: 首页 > 综合 > 正文

hdu 1716排列2

2018年01月12日 ⁄ 综合 ⁄ 共 2178字 ⁄ 字号 评论关闭

学习:

1.利用STL里的next_permutation()函数(对于n个数使用n!下就可以得出它的全排列额:

boolean next_permutation(a.begin(),a.end()) 
该函数是以输入字符串中的字符所构建的按字典顺序全排列中,判断当前字符串之后是否还有下一个字符串 
如果next_permutation的执行次数少于全排列的个数,返回true 
例如 a="abc" 全排列有 "abc" "acb" "bac" "bca" "cab" "cba"   
执行一次next_permutation 返回true  a变成 "acb"
再执行一次next_permutation 返回true a变成 "bac"
...
当执行到a="cba" 时 由于这已经是全排列的最后一个字符串,所以 再次执行next_permutation 则返回false

2.首先看什么叫字典序,顾名思义就是按照字典的顺序(a-z, 1-9)。以字典序为基础,我们可以得出任意两个数字串的大小。

我的代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int str[4]; //输入的四位数字。 
int shu[10000][4],chu[1000][4],t,h; //t表示shu中元素个数,h表示chu中元素个数。 
void painie(void);//对这四个数进行排列并储存在shu[]中,这里包含首位为0,和数字重复的情况。 
  void painie(void)
  {
  	for(int i=0;i<24;++i)//由于是4!总情况故循环24次 
  	{
	  	for(int j=0;j<=3;++j)
	  	{
	  		shu[t][j]=str[j];
	  	}
	  	t++;
	  	next_permutation(str,str+4); //每次对str中的四个元素进行排列。 
    }
  }
int main (void)
{
	int kkk=0;
	while(scanf("%d%d%d%d",&str[0],&str[1],&str[2],&str[3])&&str[0]+str[1]+str[2]+str[3])//四个同时为零退出。 
	{   
	    if(kkk++) printf("\n");//在每组数据前面输出一个空行,但第一组数据没有。 
		memset(shu,0,sizeof(shu));
		memset(chu,0,sizeof(chu));
		t=0;
		h=0; //初始化。 
		painie();
		/*for(int j=0;j<t;++j) {
		for(int i=0;i<4;++i) printf("%d",shu[j][i]);
		printf("\n");}*/
		for(int k=0;k<t;) //扫描shu中所有元素。 
		{
			if(shu[k][0]!=0)
			{
				for(int ii=0;ii<1000;ii++)//如果这个元素在chu中已经存在了或者首位为0,就不要了,用goto跳过储存。 
				{
					if(shu[k][0]==chu[ii][0]&&shu[k][1]==chu[ii][1]&&shu[k][2]==chu[ii][2]&&shu[k][3]==chu[ii][3]) goto l1;  
				}
				for(int jj=0;jj<4;jj++)
				{
					chu[h][jj]=shu[k][jj];
				}
				h++;
		    }
l1:			  k++;
				
		}
		int mm=0;
		for(int j=0;j<h;++j) 
		{
			if (chu[j][0]!=mm)
			{
			mm=chu[j][0];//记录不同的首位。 
			if(j) printf("\n"); //第一组数据前不要空行。 
		    }
		    else if(j) printf(" ");//第一个数据前不要空格,这样可以保证每行最后一个数据后面没有空格。 
		    for(int i=0;i<4;++i) printf("%d",chu[j][i]); 
		}
		printf("\n");
	}
	return 0;
}

以下为递归实现全排列:

/*µÝ¹éʵÏÖÈ«ÅÅÁУ¨22:44)*/
#include<stdio.h>
#include<string.h> 
char a[5],b[129][5];
int ht=0;//¼Ç¼bÖÐÊý¾ÝÊýÁ¿¡£  
void allsort( char str[],int n,int t);
void swap(char str[],int a,int b);
  void allsort(char str[],int n,int t)
  {
  	if(ht==0)
	{
	    for(int i=0;i<5;i++) b[ht][i]=str[i];
		ht++;
	}
  	if(n-t!=1)
  	{
  		for(int k=t;k<n;k++)
  		{
  			swap(str,t,k);
  			if(k!=t) 
			{
  			  for(int i=0;i<5;i++) b[ht][i]=str[i];
  			  ht++;
		    }
  			allsort(str,n,t+1);
  			swap(str,t,k);
  		}
  	}
  }
int main(void)
{
	scanf("%s",a);
	int n=strlen(a),t=0;
	allsort(a,n,t);
	for(int i=0;i<ht;i++)
	{
		printf("%s",b[i]);
		printf("  ");
	}
    return 0;
}
void swap(char str[],int a,int b)
{
	int c=str[a];
	str[a]=str[b];
	str[b]=c;
} 

【上篇】
【下篇】

抱歉!评论已关闭.