Cod sursa(job #1682350)

Utilizator Vladi.BarasBaras Nicholas Vladimir Laurentiu Vladi.Baras Data 10 aprilie 2016 10:38:53
Problema Tablete Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.03 kb
/*#include <fstream>

using namespace std;
int v[2][1001],n,cp;
ifstream cin("tablete.in");
ofstream cout("tablete.out");
void afisare(int n)
{
    for(int i=1; i<=2; i++)
    {
        for(int j=1; j<=n; j++)
            cout<<v[i][j]<<' ';
        cout<<'\n';
    }
}
void update(int val,int n)
{
    for(int i=1; i<=2; i++)
    {
        for(int j=1; j<=n; j++)
        {
            v[i][j]+=val;
        }
    }
}
int main()
{
    int n,k;
    cin>>n>>k;int cp=n;
    if(n%2==0&&k%2==0)
    {

        for(int i=1; i<=n*n; i++)
        {
            cout<<i<<" ";
            if(i%n==0)cout<<'\n';
        }
}
    if(n%2==0&&k%2==1)
    {
        for(int i=1; i<n; i++)
        {
            v[1][i]=i+1;
        }
        v[1][n]=2*n;
        v[2][1]=1;
        for(int i=2; i<=n; i++)
        {
            v[2][i]=n-1+i;
        }
        v[2][n]=2*n-1;
        for(int i=1;i<=n/2;++i)
        {
            afisare(n);
            update(2*n,n);
        }

    }
    if(n%2==1&&k%2==0)
    {
        for(int i=1; i<n; i++)
        {
            v[1][i]=i;
            v[2][i]=i+n-1;
        }
        v[1][n]=2*n-1;
        v[2][n]=2*n;
         for(int i=1;i<=n/2;++i)
        {
            afisare(n);
            update(2*n,n);
        }
        for(int i=1;i<=n;i++)
        {
            cout<<(n-1)*n+i<<" ";
        }cout<<'\n';
    }
    if(n%2==1&&k%2==1)
    {v[2][1]=1;
        for(int i=1;i<=n;i++)
        {
            v[1][i]=i+1;

        }
        for(int i=2;i<=n;i++)
        {
            v[2][i]=i+n;
        }
        afisare(n);
     for(int i=2;i<=n/2-1;i++)
     {
         update(2*n,n);
         afisare(n);
              }
              update(2*n,n);
              v[2][n]=n*n;
              afisare(n);
              for(int i=1;i<=n;i++)
              {
                  cout<<n*n-n-1+i<<' ';
              }
 cout<<'\n';
    }

    return 0;
}
*/
#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);
  }