Cod sursa(job #2550976)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 19 februarie 2020 12:27:55
Problema Prefix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
#define Nmax 20
using namespace std;
ifstream fin("ornament.in");
ofstream fout("ornament.out");

void Citire();
void Back(int,int);
inline bool Valid(int,int);
void Afisare();

struct patrat
{
    int N,E,S,V;
};

patrat a[Nmax];
int n,m;
int task;

int x[Nmax][Nmax];
bool viz[Nmax];
bool ok;
int nrsol;

int main()
{
    Citire();
    Back(1,1);
    if(task==2) fout<<nrsol;
    fout.close();
    return 0;
}

void Citire()
{
    int i;
    fin>>n;
    m=sqrt(n);
    for(i=1;i<=n;++i)
        fin>>a[i].N>>a[i].E>>a[i].S>>a[i].V;
    fin>>task;
    fin.close();
}

void Back(int l,int c)
{
    for(int i=1;i<=n && !ok;++i)
        if(!viz[i])
        {
            x[l][c]=i;
            viz[i]=1;
            if(Valid(l,c))
                if(l==m && c==m)
                    if(task==1) {Afisare();ok=1;}
                    else ++nrsol;
                else
                   if(c<m) Back(l,c+1);
                   else Back(l+1,1);
            viz[i]=0;
        }
}

inline bool Valid(int l,int c)
{
    if(l==1 && c==1) return 1;
    if(l==1 && a[ x[l][c] ].V == a[ x[l][c-1] ].E ) return 1;
    if(c==1 && a[ x[l][c] ].N == a[ x[l-1][c] ].S ) return 1;
    if(a[ x[l][c] ].V == a[ x[l][c-1] ].E && a[ x[l][c] ].N == a[ x[l-1][c] ].S ) return 1;
    return 0;
}

void Afisare()
{
    for(int i=1;i<=m;++i)
    {
        for(int j=1;j<=m;++j)
            fout<<x[i][j]<<' ';
        fout<<'\n';
    }
}