HDU1716排序2(最经典的输出格式)

题目大意:现有四张卡片,用这四张卡片能排列出很多不同的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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值