又是全排列问题(hdu 1716)

来源:互联网 发布:最后的晚餐 知乎 编辑:程序博客网 时间:2024/05/18 03:34

  又是一全排列问题:和hdu1027不同的是:这个要输出全部的序列,而且必须按照题目的格式控制来!

#include <iostream>#include <string.h>#include <algorithm>using namespace std;int flag[24][4];int main(){    int i,j,k,h;    int sum;    int mad=0;    int b[4];    while(1)    {        sum=0;        k=0;/**< k表示排列数的计数作用,方便格式的输出 */        memset(flag,0,sizeof(flag));        for(i=0;i<4;i++)        {            cin>>b[i];            sum+=b[i];        }        if(sum==0)/**< 如果输入的全为0,那么直接终止输入 */                break;        if(mad!=0)            cout<<endl;        mad=1;        sort(b,b+4);        for(i=0;i<4;i++)        {            if(b[i]>0)                break;        }        j=i;/**<  记录第一位非0的数字*/        swap(b[0],b[j]);        //prit(b);        /**< 将产生的其中一个全排列存储起来 */        for(i=0;i<4;i++)            flag[k][i]=b[i];        k++;/**< 下一个全排列 */        /**< 产生全排列 */        while(1)        {            for(i=3;i>=1;i--)                if(b[i]>b[i-1])                break;            if(i<1)                break;            for(j=3;j>=i;j--)            {                 if(b[j]>b[i-1])                 {                     swap(b[j],b[i-1]);                     sort(b+i,b+4);                     for(h=0;h<4;h++)                        flag[k][h]=b[h];                     k++;                     break;                 }            }        }       for(i=0;i<k;i++)       {           for(j=0;j<4;j++)            cout<<flag[i][j];           if(flag[i][0]!=flag[i+1][0])            cout<<endl;           else            cout<<' ';       }    }    return 0;}


0 0
原创粉丝点击