#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:
Postări (Atom)