手写的next_permutation比库函数写的高了一倍的时间额。

 

CODE:

 

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int N, H;
        char s[20] = {'\0'};
        scanf("%d%d", &N, &H);
        for(int i = N-1; i >= 0 ; i--)
        {
            if(H)
            {
                s[i] = '1';
                H--;
            }
            else s[i] = '0';
        }
        do
        {
            printf("%s\n", s);
        }while(next_permutation(s, s+N));
        if(T > 0) printf("\n");
    }
    return 0;
}

 

CODE:

 

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 20

int P[MAXN], A[MAXN], N, H;

void print_permutation( int N, int *P, int *A, int cur)
{
    if( cur == N){
        forint i = 0; i < N; i ++)
            printf( "%d", A[i]);
    printf( "\n");
    }
    else forint i = 0; i < N; i ++)
        if( !i || P[i] != P[i - 1])
        {
            int c1 = 0, c2 = 0;
            forint j = 0; j < cur; j ++) if( A[j] == P[i]) c1 ++;
            forint j = 0; j < N; j ++) if( P[i] == P[j]) c2 ++;
            if( c1 < c2)
            {
                A[cur] = P[i];
                print_permutation( N, P, A, cur + 1);
            }
        }
}

int main()
{
    int T;
    scanf( "%d", &T);
    while( T --)
    {
        scanf( "%d%d", &N, &H);
        forint i = 0; i < N; i ++)
        {
            if( i < N - H) P[i] = 0;
            else P[i] = 1;
        }
        print_permutation( N, P, A, 0);
        if( T > 0) printf( "\n");
    }
    return 0;
}

 

posted on 2012-09-24 17:58  有间博客  阅读(161)  评论(0编辑  收藏  举报