Cod sursa(job #3217284)

Utilizator AndreibatmanAndrei Croitoriu Andreibatman Data 22 martie 2024 09:55:34
Problema NKPerm Scor 10
Compilator cpp-64 Status done
Runda simulare_preoni_ig Marime 1.66 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
ifstream fin("nkperm.in");
ofstream fout("nkperm.out");
int sol[300],fol[300],n,k,v[300],cnt,gasit,x,t,i;
char type;
void afisare()
{
    for(int i=1;i<=n*k;i++)
        fout<<sol[i]<<" ";
    fout<<'\n';
}
void bkt(int poz)
{
    if(cnt==x)
        return;
    if(poz==n*k+1)
    {
        cnt++;
        if(cnt==x)
            afisare();
        return;
    }
    for(int i=1;i<=n;i++)
        if(fol[i]<k && sol[poz-1]!=i)
        {
            fol[i]++;
            sol[poz]=i;
            bkt(poz+1);
            fol[i]--;
            sol[poz]=0;
            if(cnt==x)
                return;
        }
}
void bkt2(int poz,int ok)
{
    if(gasit==1)
        return;
    if(poz==n*k+1)
    {
        cnt++;
        if(ok==1)
        {
            gasit=1;
            fout<<cnt<<'\n';
        }
        return;
    }
    for(int i=1;i<=n;i++)
        if(fol[i]<k && sol[poz-1]!=i)
        {
            fol[i]++;
            sol[poz]=i;
            if(ok==1 && sol[poz]!=v[poz])
                bkt2(poz+1,0);
            else
                bkt2(poz+1,ok);
            fol[i]--;
            sol[poz]=0;
            if(gasit==1)
                return;
        }
}
int main()
{
    fin>>n>>k>>t;
    while(t--)
    {
        fin>>type;
        if(type=='B')
        {
            fin>>x;
            cnt=0;
            bkt(1);
        }
        else
        {
            for(i=1;i<=n*k;i++)
                fin>>v[i];
            cnt=0;
            gasit=0;
            bkt2(1,1);
        }
    }
    return 0;
}