Cod sursa(job #360161)

Utilizator Cristi09Cristi Cristi09 Data 30 octombrie 2009 10:07:00
Problema Dame Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<stdio.h>

int x[1001],n,k,as,ev,var=0,ok=1;
FILE*g=fopen("dame.out","w");
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()
{    fprintf(g,"%d\n",n);
     int i,j;
     for(i=0;i<n;++i)
     {
      for(j=0;j<n;++j)
      if(x[i]==j)fprintf(g,"%d %d\n",i+1,j+1);
     }
     fprintf(g,"\n");
     ok=0;
}
int main()
{
     FILE*f=fopen("dame.in","r");
     fscanf(f,"%d",&n);
     fclose(f);
     if(n==1||n==2){fprintf(g,"%d\n%d %d",1,1,1);ok=0;}
     if(n==3){fprintf(g,"%d\n%d %d\n%d %d",2,1,1,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;
     }
     fclose(g);
     return 0;
}