Pagini recente » infoarena - te ajutam sa devii olimpic! | Cod sursa (job #913656) | infoarena - comunitate informatica, concursuri de programare | Cod sursa (job #1402948) | Cod sursa (job #1325508)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("copii.in");
ofstream g("copii.out");
int posibilitati, matrice[101][101], n,k,as,se,v[101],gasite[101][101];
void citire ()
{
int i,j;
char rand [101];
f>>n;
f.get ();
for (i=1;i<=n;i++)
{
f.getline (rand,101);
for (j=1;j<=n;j++)
matrice [i][j] = rand [j-1]-'0';
}
for (i=1;i<=n;i++)
matrice [i][i]=1;
}
void init ()
{
v[k]=0;
}
int validare1 ()
{
if (v[k]<v[k-1]+1)
{
v[k]++;
return 1;
}
return 0;
}
int validare2 ()
{
return 1;
}
int verificare ()
{
if (k==n)
return 1; return 0;
}
void afisare ()
{
int maxim =0,i=1,j=1;
while (i<=n)
{
j=1;
if (v[i]>maxim)
maxim = v[i];
while (j<=n)
{
if (matrice [i][j]==1)
gasite [v[i]][v[j]]==1;
j++;
}
i++;
}
for (i=1;i<=maxim;i++)
for (j=1;j<=maxim;j++)
if (i!=j && gasite [i][j]==0)
{
for (i=1;i<=maxim;i++)
for (j=1;j<=maxim;j++)
gasite [i][j]=0;
return ;
}
for (i=1;i<=maxim;i++)
for (j=1;j<=maxim;j++)
gasite [i][j]=0;
posibilitati ++;
}
void backtracking ()
{
k=1;
init ();
while (k>0)
{
as=1;
se=0;
while (as && !se)
{
as=validare1 ();
if (as)
se = validare2 ();
}
if (as)
if (verificare ())
afisare ();
else
{
k++;
init ();
}
else
k--;
}
}
int main()
{
citire ();
backtracking ();
g << posibilitati;
return 0;
}