Cod sursa(job #466318)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 26 iunie 2010 13:01:58
Problema Permutari2 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.29 kb
#include<cstdio>
using namespace std;

int st[100],i,n,ka,cont=0;

void init (int k)
{
    st[k]=0;
}

int succesor (int k)
{
    if (st[k]<n)
    {
        st[k]++;
        return 1;
    }
    return 0;
}

int valid (int k)
{
    int contor=0,max=0;
    for (i=1; i<k; i++)
    {
        if (st[i]==st[k]) return 0;
        if (st[i]>max) max=st[i];
        if (max<=i) contor++;
    }
    if (contor>ka) return 0;
    return 1;
}

int solutie (int k)
{
    if (k!=n) return 0;
    int maxim=0,contor=0;
    for (i=1; i<=k; i++)
    {
        if (st[i]>maxim) maxim=st[i];
        if (maxim<=i) contor++;
    }
    if (contor!=ka) return 0;
    return 1;
}

void tipar()
{
    for (i=1; i<=n; i++)
        printf("%d ",st[i]);
    printf("\n");
}

void back (int k)
{
    init(k);
    while (succesor(k))
    {
        if (valid(k))
            if (solutie(k))
            {
                cont++;
               tipar();
            }
        else back(k+1);
    }
}

int main ()
{
    freopen("permutari2.in","r",stdin);
    freopen("permutari2.out","w",stdout);
    scanf("%d%d",&n,&ka);
    if (n==ka) printf("1");
    else if (n-ka==1) printf("%d",ka);
    else
    {
        back(1);
        printf("%d",cont);
    }
    return 0;
}