HDU-1716順列2(暴力; next_permutation)

レイは再び数字の列に興味を持っています
。4枚のカードがあり、これらの4枚のカードでさまざまな4桁の数字を並べることができ、これらの4桁の数字は昇順で出力する必要があります。
入力
のデータの各グループは、4枚のカードの数字を表す1行を占めます(0 <=数字<= 9)。4枚のカードがすべて0の場合、入力は終了します。
出力
は、これらの4枚のカードで構成できる4桁すべてを、カードのグループごとに小さいものから大きいものの順に出力します。数千桁は同じ行にあり、同じ行の各4桁はスペースで区切られています。
出力データの各セットの間には空白行があり、最後のデータセットの後に空白行はありません。
サンプル入力
12 3 4
1 1 2 3
0 1 2 3
0 0 00
サンプル出力
12341243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321

1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211

1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210
スポンサーの
問題解決のアイデア:
合計4桁しかないため、すべての可能性を直接激しく見つけて並べ替えることができます。

桁数が多い場合は、暴力だけでは不十分です。STLフルソート関数を使用できます。小さいものから大きいものまであるため、next_permutation()関数を使用します。next_permutation()関数の
詳細を紹介します。next_permutation()関数

ブルートコード

#include<bits/stdc++.h>
using namespace std;
int a[10],b[1010],c[1000];
int main()
{
    
    
	int i,j,k,m;
	int x=0;
    while(1)
    {
    
    
        scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]);
        if(a[0]+a[1]+a[2]+a[3]==0)
	 		break;
        if(x) 
			printf("\n");
        x=1;
		int t=1;
		//暴力循环
		for(i=0;i<4;i++)
		{
    
    
			if(a[i]!=0)//直接舍去0的情况
			for(j=0;j<4;j++)
			for(k=0;k<4;k++)
			for(m=0;m<4;m++)
			if(i!=j&&i!=k&&i!=m&&j!=k&&j!=m&&k!=m)
			{
    
    
				b[t++]=a[i]*1000+a[j]*100+a[k]*10+a[m];//存入数组b
			}
		}
		sort(b,b+t);//排序
		b[0]=0;j=1;
		for(i=1;i<t;i++)//去重
		{
    
    
			if(b[i]==b[i+1])
			continue;
			c[j++]=b[i];
		}
		c[j]=0;
		for(i=1;i<j;i++)
		{
    
    
			if(c[i]/1000==c[i+1]/1000)
			printf("%d ",c[i]);
			else
			printf("%d\n",c[i]);
		}
	}
 } 

next_permutationコード

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    
    
    int a[5];
    int x=0;
    while(1)
    {
    
    
        scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]);
        if(a[0]+a[1]+a[2]+a[3]==0)
	 		break;
        if(x) 
			printf("\n");
        x=1;
        sort(a,a+4);
        int k=0,w=0;
	   do{
    
    
            if(a[0]==0)
				continue;
			if(k==0)
				k=1;
            else 
			if(w==a[0]) 
				printf(" ");
            else  
				printf("\n");
			printf("%d%d%d%d",a[0],a[1],a[2],a[3]);
            w=a[0];
        }while(next_permutation(a, a +4));
        printf("\n");
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_46703995/article/details/112999361