#include <iostream>
using namespace std;
int a[25][25], b[25], n;
int main()
{
// citire date
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) cin >> a[i][j];
// generare secvente binare
for (int i = 0; i <= n; i++) b[i] = 0;
while (!b[0])
{
// for (int i = 1; i <= n; i++) cout << b[i];
// cout << endl;
int k = n;
while (b[k]) b[k] = 0, k--;
b[k] = 1;
// verificari pentru secventsa curenta
// verificarea 1 - este independenta sau nu?
// daca in final flag e 0 - independenta
int flag = 0;
for (int i = 1; i < n; i++)
for (int j = i + 1; j <= n; j++)
if (b[i] && b[j] && a[i][j]) { flag = 1; break;}
// verificarea 2 - e maximal independenta?
int flag2 = 0;
for (int i = 1; i < n; i++)
{
if(!b[i])
{
int tmp = 1;
for (int j = 1; j <= n; j++)
if (b[j] && a[i][j]) { tmp = 0; break;}
if (tmp) flag2 = 1;
}
}
if (flag + flag2 == 0)
{
for (int i = 1; i <= n; i++) cout << b[i];
cout << endl;
}
}
return 0;
}
#include <iostream>
using namespace std;
int a[100][100], sol[100], n;
void afis(int k)
{
for (int i = 1; i <= k; i++) cout <<" " << sol[i];
cout << endl << "----------" << endl;
}
void back(int v, int k)
{
int f1, f2, count = 0;
if (k < 1) return;
sol[k] = v;
// afis(k);
for (int x = 1; x <= n; x++)
{
f1 = 0; f2 = 0;
// verificarea daca x coincide cu un element al solutiei
for (int i = 1; i <= k; i++) if (x == sol[i]) { f1 = 1; break;}
// verificarea daca x este vecin cu un element al solutiei
for (int i = 1; i <= k; i++)
if (a[x][sol[i]] == 1) { f2 = 1; break;}
if (f1 + f2 == 0) { back(x, k + 1); count++;}
}
if (!count) { cout << "solutie "; afis(k);} // afisare solutiei
return;
}
int main()
{
// readdata
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) cin >> a[i][j];
// verificare - afisare A
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++) cout << a[i][j] <<" ";
cout << endl;
}
// formare recursiva solutii
for (int i = 1; i <= n; i++) back(i, 1);
return 0;
}