#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;
}
#2124 Ornament
Abonați-vă la:
Comentarii (Atom)