枚举-排序-数组

时间:2022-08-28 19:53:31

题目描述:

    A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

    请填写出所有符合要求的排列中,字典序最小的那个。

例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。

#include<stdio.h>
char puke[8]={'A','A','2','2','3','3','4','4'};
char puke1[8];
int find(char a,int x){
	int i;
	for(i=x;i<8;i++){
		if(puke1[i]==a){
			return i;
		}
	}	
}
int main(){
	int  a,b,c,d,e,f,g,h;
	for(a=0;a<8;a++){
		puke1[0]=puke[a];
		for(b=0;b<8;b++){
			if(b==a)continue;
			puke1[1]=puke[b];
			for(c=0;c<8;c++){
				if(c==a||c==b)continue;
				puke1[2]=puke[c];
				for(d=0;d<8;d++){
					if(d==a||d==b||d==c)continue;
					puke1[3]=puke[d];
					for(e=0;e<8;e++){
						if(e==a||e==b||e==c||e==d)continue;
						puke1[4]=puke[e];
						for(f=0;f<8;f++){
							if(f==a||f==b||f==c||f==d||f==e)continue;
							puke1[5]=puke[f];
							for(g=0;g<8;g++){
								if(g==a||g==b||g==c||g==d||g==e||g==f)continue;
								puke1[6]=puke[g];
								for(h=0;h<8;h++){
									if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
			                		puke1[7]=puke[h];
			                		int i1=find('A',0);
			                		int i2=find('A',i1+1);
			                		int i3=find('2',0);
			                		int i4=find('2',i3+1);
									int i5=find('3',0);
									int i6=find('3',i5+1);
									int i7=find('4',0);
									int i8=find('4',i7+1);
									//printf("%d %d %d %d %d %d %d %d %d\n",i1,i2,i3,i4,i5,i6,i7,i8);
									if((i2-i1)==2&&(i4-i3)==3&&(i6-i5)==4&&(i8-i7)==5)	{
										for(int i=0;i<8;i++){
											printf("%c",puke1[i]);
										}
										printf("\n");
										return 0;
									}			
		                         }
		                    }
		   				}
		  		   }
		       }
		   }
		
		}		
	}
	
return 0;
}