Pagini recente » Cod sursa (job #3152087) | Cod sursa (job #918650) | Cod sursa (job #2327140) | Cod sursa (job #1954123) | Cod sursa (job #2475909)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 11;
int cnt = 0;
int N;
int A[MAXN][MAXN];
int arr[MAXN];
vector< vector<int> > relations(MAXN, vector<int>(MAXN, 0));
bool check(int arr[MAXN], int groups, int maxN) {
for (int i = 0; i < MAXN; i++)
for (int j = 0; j < MAXN; j++) relations[i][j] = 0;
for (int from = 1; from <= maxN; from++) {
for (int to = 1; to <= maxN; to++) {
//if (arr[from] == arr[to]) continue;
relations[ arr[from] ][ arr[to] ] |= A[from][to];
}
}
for (int i = 1; i <= groups; i++) {
for (int j = 1; j <= groups; j++) {
if (i == j) continue;
if (!relations[i][j]) return false;
}
}
return true;
}
void backtrack(int lastGroup, int step, int maxN, int arr[MAXN]) {
if ( step > maxN) {
//if (lastGroup == 1) return ;
cnt += check(arr, lastGroup, maxN);
return;
}
for (int i = 1; i <= min (lastGroup + 1, maxN ); i++) {
arr[step] = i;
backtrack(max(i, lastGroup), step + 1, maxN, arr);
arr[step] = 0;
}
}
int main(){
ifstream cin("copii.in");
ofstream cout("copii.out");
cin >> N;
for( int i = 1; i <= N; i++) {
for ( int j = 1; j <= N; j++) {\
char x;
cin >> x;
if (x == '1') A[i][j] = 1;
//cin >> A[i][j];
}
}
backtrack(0, 1, N, arr);
cout << cnt - 1;
return 0;
}