Cod sursa(job #354375)

Utilizator Cristi09Cristi Cristi09 Data 7 octombrie 2009 20:45:27
Problema Dame Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<fstream.h>

int x[1001],n,k,as,ev,var=0,ok=1;
ofstream g("dame.out");
void init(int pa)
{
     x[k]=0;
     if(!pa)var=1;
}
void succesor()
{
     as=0;
     if(var==1){k++;x[k]=0;as=1;var=0;}
     else
      if(x[k]<n-1&&var!=2)
      {
               x[k]++;
               as=1;
      }
      if(var==2){as=1;var=0;}
}
void valid()
{
     ev=1;
     int i=0,j,l;
     for(i=k-1,j=x[k]-1,l=x[k]+1;i>=0&&ev;i--,j--,l++)
     {if(x[i]==x[k]||(j>=0&&x[i]==j)||(l<n&&x[i]==l)){ev=0;}}

    // for(i=k-1,j=x[k]-1;i>=0&&j>=0&&ev;i--,j--)
    // if(x[i]==j)ev=0;

     //for(i=k-1,j=x[k]+1;i>=0&&j<n&&ev;j++,i--)
     //if(x[i]==j)ev=0;
}
int solutie()
{
    return k==n-1;
}
void tipar()
{    g<<n<<'\n';
     int i,j;
     for(i=0;i<n;i++)
     {
      for(j=0;j<n;j++)
      if(x[i]==j)g<<i+1<<" "<<j+1<<'\n';
     }
     g<<'\n';
     ok=0;
}
int main()
{
     ifstream f("dame.in");
     f>>n;
     f.close();
     if(n==1){g<<1<<'\n'<<1<<" "<<1;ok=0;}
     if(n==2){g<<1<<'\n'<<1<<" "<<1;ok=0;}
     if(n==3){g<<2<<'\n'<<1<<" "<<1<<'\n'<<3<<" "<<2;ok=0;}

     k=0;
     init(0);
     while(k>=0&&ok)
     {
               do
               {
                     succesor();
                     if(as)valid();
               }while(!(!as||as&&ev));
               if(as)
                  if(solutie())
                  tipar();
                  else
                  {
                      k++;init(1);var=2;
                  }
               else k--;
     }
     g.close();
     return 0;
}