题目大意:现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。
题目解析:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ret[5];//记录每位要填的数
int use[5];//标记m个数可以使用的次数;
int a[5];//存放互不相同的升序数;
int flag,sign,sign1;
void unrepeat_comb(int l )//输出不重复排列
{
int i;
if(l==4)
{
if(ret[0]==0)return;//当数组的第一个数为0时,则不输出;
sign++;
if(flag!=ret[0])//flag标记是否需要换行;即当前数组首位是否与上一个数组首位相同,若不同则输出换行;
{
if(flag!=0)//若数组a的第一个数为0;则不许要换行;否则 ;
printf("\n");
flag=ret[0];
}
else
if(sign!=1)//标记是否为第一个输出的数,第一行的第一个数前不要输出空格;
printf(" ");
for( i=0;i<4;i++)
{
printf("%d",ret[i]);
}
}
for(i=0;i<4;i++)
{
if(use[i]>0)
{
use[i]--;ret[l]=a[i];
unrepeat_comb(l+1);
use[i]++;
}
}
}
int init()//初始化
{
int i,j;
int x,k=0;
int b[5];
memset(a,0,sizeof(a));
memset(ret,0,sizeof(ret));
memset(use,0,sizeof(use));
for( i=0;i<4;i++)
scanf("%d",&b[i]);
sort(b,b+4);//先排序,再去掉重复;
for( i=0;i<4;i++)
{
if(i==0||b[i]!=b[i-1])
{
a[k]=b[i];
use[k++]=1;
}
else
{
use[k-1]++;
}
}
if(a[0]==0&&use[0]==4)
return 0;
flag=a[0];
sign=0;
return 1;
}
int main()
{
sign1=0;//标记是否是第一组数;
while(init())
{
if(sign1++!=0)printf("\n");//不是第一种情况,则输出换行;
unrepeat_comb(0);
printf("\n");
}
return 0;
}