Cod sursa(job #109463)

Utilizator the_dragon_of_rockTzogorean Alex the_dragon_of_rock Data 25 noiembrie 2007 11:13:12
Problema NKPerm Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 2.13 kb
#include<fstream.h>
int n,m,t,stop;
long long int a,b;
int x[105],y[105];

int cont(int k)
{
    int i,p=0;
    if (x[k-1]==x[k])
        return 0;
    for (i=1;i<k;i++)
        if (x[i]==x[k])
                p++;
    if (p>=m)
        return 0;
    return 1;
}    

void chestie1()
{
    int i,ok=1;
    for (i=1;i<=n*m && ok;i++)
        if (x[i]!=y[i])
                ok=0;
    if (ok)
        {
            b=a;
            stop=1;
        }    
}    

void back1(int k)
{
    int i;
    for (i=1;i<=n && !stop;i++)
        {
            x[k]=i;
            if (cont(k))
                  if (k==n*m)
                        {
                            a++;
                            chestie1();
                        }    
                  else
                        back1(k+1);
        }    
}    

void chestie2()
{
    int i;
    if (b==a)
        {
                for (i=1;i<=n*m;i++)
                                y[i]=x[i];
                stop=1;
        }    
}    

void back2(int k)
{
    int i;
    for (i=1;i<=n && !stop;i++)
        {
            x[k]=i;
            if (cont(k))
                  if (k==n*m)
                        {
                            b++;
                            chestie2();
                        }    
                  else
                        back2(k+1);
        }    
}    

int main()
{
    ifstream in("nkperm.in");
    ofstream out("nkperm.out");
    in>>n>>m>>t;
    int i,j;
    char c;
    for (j=1;j<=t;j++)
        {
            in>>c;
            stop=0;
            if (c=='A')
                {
                    for (i=1;i<=n*m;i++)
                            in>>y[i];
                    b=0;
                    back1(1);
                    out<<b<<"\n";
                }
            if (c=='B')
                {        
                    in>>a;
                    b=0;
                    back2(1);
                    for (i=1;i<=n*m;i++)
                            out<<y[i]<<" ";
                    out<<"\n";
                }    
        }    
    return 0;
}