【杭电】[1716]排列2

这里写图片描述
这里写图片描述

一个输出排列组合结果的题目
起初忘了C++里的函数……
所以硬写的

#include<stdio.h>
#include<algorithm>
using namespace std;
int x[10000];
int main() {
    int a[4];
    bool kaseflag=false;
    while(scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]),a[0]||a[1]||a[2]||a[3]) {
        if(kaseflag)
            printf("\n");
        sort(a,a+4);
        for(int i=0; i<4; i++) {
            bool flag=false;
            int ti=a[i];
            for(int j=0; j<4; j++) {
                if(j!=i) {
                    int tj=ti*10+a[j];
                    for(int k=0; k<4; k++) {
                        if(k!=i&&k!=j) {
                            int tk=tj*10+a[k];
                            for(int p=0; p<4; p++) {
                                if(p!=i&&p!=j&&p!=k) {
                                    int tp=tk*10+a[p];
                                    if(tp<1000)
                                        continue;
                                    if(!x[tp]) {
                                        x[tp]=1;
                                        if(flag)
                                            printf(" %d",tp);
                                        else
                                            printf("%d",tp);
                                        flag=true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if(flag)
                printf("\n");
        }
        kaseflag=true;
    }
    return 0;
}

然后又写了一个C++
next_permutation
的版本

需要注意的是用这个函数时要保证初始数组已经是从小到大的
(这一题题目没说 不过测试数据应该都是已经排序过的)

#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
    int a[4];
    bool kaseflag=false;
    while(scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]),a[0]||a[1]||a[2]||a[3]) {
        sort(a,a+4);
    //无意中发现 如果不排序会出BUG  
    //不排序错误数据
    //3 6 8 4
    //3 8 4 6
    //……等等 
        if(kaseflag)
            printf("\n");
        int t;
        bool flag=true;
        do {
            if(a[0]==0)
                continue;
            if(flag) {
                printf("%d%d%d%d",a[0],a[1],a[2],a[3]);
                flag=false;
            } else if(t==a[0])
                printf(" %d%d%d%d",a[0],a[1],a[2],a[3]);
            else
                printf("\n%d%d%d%d",a[0],a[1],a[2],a[3]);
            t=a[0];
        } while(next_permutation(a,a+4));
        printf("\n");
        kaseflag=true;
    }
    return 0;
}

题目地址:【杭电】[1716]排列2

posted @ 2016-03-18 23:10  BoilTask  阅读(10)  评论(0编辑  收藏  举报