Pagini recente » Cod sursa (job #1525899) | Cod sursa (job #397272) | Cod sursa (job #423990)
Cod sursa(job #423990)
#include <fstream>
using namespace std;
ifstream FIn("copii.in");
ofstream FOut("copii.out");
const int NMax=1<<4;
char S[NMax][NMax];
bool a[NMax][NMax];
int sol[NMax],N,MAX;
long long Ans;
void EXE(),IN(),OUT(),BKT(int);
bool BKT_CHECK();
int main(){EXE();return 0;}
void EXE(){
IN();
BKT(1);
OUT();
}
void IN(){
FIn>>N>>ws;
for(int i=1;i<=N;FIn.getline(1+S[i++],N+1));
for(int i=1;i<=N;++i){
for(int j=1;j<=N;a[i][j]=S[i][j]-'0',++j);
}
}
void BKT(int p){
if(p==1+N){
if(BKT_CHECK())
++Ans;
return;
}
for(int i=1;i<=MAX;++i){
sol[p]=i;
BKT(1+p);
}
sol[p]=++MAX;
BKT(1+p);
--MAX;
}
bool BKT_CHECK(){
bool y[NMax][NMax];
int i,j;
if(MAX==1)
return false;
for(i=1;i<=MAX;++i){
for(j=1;j<=MAX;++j){
y[i][j]=false;
}
}
for(i=1;i<=N;++i){
for(j=1;j<=N;++j){
if(a[i][j]){
y[sol[i]][sol[j]]=true;
}
}
}
for(i=1;i<=MAX;++i){
for(j=1;j<=MAX;++j){
if(i!=j && !y[i][j])
return false;
}
}
return true;
}
void OUT(){
FOut<<Ans;
}