Meniu

#2124 Ornament

#include <fstream>
using namespace std;
ifstream fin("ornament.in");
ofstream fout("ornament.out");
struct patrat
{
    int n,e,s,v;
} v[17];
int a[5][5],n,caz,use[17],ok,sol;
void citire()
{
    int i;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>v[i].n>>v[i].e>>v[i].s>>v[i].v;
    }
    fin>>caz;
}
void afisare(int k)
{
    int i,j;
    for(i=1; i<=k; i++)
    {
        for(j=1; j<=k; j++)
            fout<<a[i][j]<<' ';
        fout<<'\n';
    }
}
int valid(int i,int j,int t)
{
    int p,q;
    if(i==1&&j==1)return 1;
    if(i==1)
    {
        p=a[i][j-1]; q=a[i][j];
        if(v[p].e!=v[q].v)return 0;
        }
    else if(j==1)
    {
        p=a[i-1][j]; q=a[i][j];
        if(v[p].s!=v[q].n)return 0;
        }
    else
    {
        p=a[i-1][j]; q=a[i][j];
                        if(v[p].s!=v[q].n)return 0;
                                    p=a[i][j-1];
                                      if(v[p].e!=v[q].v)return 0;

                                          }
    return 1;
}
void back1(int i, int j)
{
    int t;
    if(!ok)
        if(i*i>n)
        {
            afisare(i-1);
            ok=1;
        }
        else
        for(t=1; t<=n; t++)
                if(use[t]==0)
                {
                    a[i][j]=t;
                    use[t]=1;
                   if(valid(i,j,t))
                    {
                        if(j*j<n)back1(i,j+1);
                        else back1(i+1,1);
                    }
                    use[t]=0;
                }
}
void back2(int i, int j)
{
    int t;
    if(i*i>n)
    {
        sol++;
    }
    else
        for(t=1; t<=n; t++)
            if(use[t]==0)
            {
                a[i][j]=t;
                use[t]=1;
                if(valid(i,j,t))
                {
                    if(j*j<n)back2(i,j+1);
                    else back2(i+1,1);
                }
                use[t]=0;
            }
}
int main()
{
    citire();
    if(caz==1)back1(1,1);
    else
    {
        back2(1,1);
        fout<<sol;
    }
    fout.close();
    return 0;
}