Cod sursa(job #557600)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 16 martie 2011 18:41:55
Problema Tablete Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#define InFile "tablete.in"
#define OutFile "tablete.out"
#define Nmax 1000
FILE *fin=freopen(InFile,"r",stdin),*fout=freopen(OutFile,"w",stdout);
long  a[Nmax+1][Nmax+1];
int   n,K,uz[Nmax*Nmax+2];
void Tablete(int i)
   {if(i==n+1) return;
    int ok=1;
    long nr=i*K%2==0?i*K:i*K+1,lg=0,j,v[Nmax+1],nr2;
    do
     {if(!ok)
        {nr+=2; for(j=1;j<=lg;j++) uz[v[i]]=0;}
      ok=1;
      if(uz[nr]) while(uz[nr]&&nr<=n*n) nr+=2;
      a[i][K]=nr; uz[nr]=1; v[++lg]=nr;
      for(j=K-1;j>=1&&ok;j--)
         {nr2=a[i][j+1]-1;
          if(uz[nr2]) while(uz[nr2]&&nr2>=1) nr2--;
          if(nr2<=1&&j>1) ok=0;
            else {a[i][j]=nr2; uz[nr2]=1; v[++lg]=nr2;}
         }
     }while(!ok);
    Tablete(i+1);
   }
int main()
  {long i,j,nr;
   scanf("%d %d",&n,&K);
   fclose(fin);
   Tablete(1);
   for(i=1;i<=n;i++)
      {nr=n-K;
       for(j=1;j<=K;j++) printf("%ld ",a[i][j]);
           for(j=a[i][K];j<=n*n&&nr;j++)
              if(!uz[j]) {printf("%ld ",j); uz[j]=1; nr--;}
       printf("\n");
      }
   fclose(fout);
  }