Cod sursa(job #239250)

Utilizator alexandru92alexandru alexandru92 Data 4 ianuarie 2009 14:16:31
Problema Tablete Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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);
  /* if(K%2==0)
     for(i=1;i<=n;i++)
        {for(j=1;j<=n;j++) printf("%ld ",i*j);
         printf("\n");
        }
     else  */
        {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);
  }