您的位置:首页 > 其它

又是全排列问题(hdu 1716)

2014-08-12 23:27 429 查看
  又是一全排列问题:和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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  全排列 组合数学