Cod sursa(job #230873)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 14 decembrie 2008 10:47:55
Problema Tablete Scor 90
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Studenti Marime 2.36 kb
# include <stdio.h>

const long int MAXN=1000;

long int n,k;

void citire()
{
     FILE *f=fopen("tablete.in","r");
     fscanf(f,"%ld%ld",&n,&k);
     fclose(f);
}

void calculeaza()
{
     FILE *g=fopen("tablete.out","w");
     long int i,j,c=0;
     for (i=1;i<=n;i++)
         {
         for (j=1;j<=n;j++)
             {
             ++c;
             if (j>1) fprintf(g," ");
             //k par, n par
             if (k%2==0 && n%2==0) fprintf(g,"%ld",c);
             //k par, n impar
             if (k%2==0 && n%2==1)
                {
                //liniile impare diferite de n primesc c+n pe ultima pozitie
                if (i%2==1 && i<n && j==n) fprintf(g,"%ld",c+n);
                //liniile pare devin +1
                else if (i%2==0) fprintf(g,"%ld",c-1);
                //altfel raman la fel
                else fprintf(g,"%ld",c);
                }
             //k impar, n par
             if (k%2==1 && n%2==0)
                {
                //pr prima linie sari peste k
                if (i==1)
                   if (j>=k && j<n) fprintf(g,"%ld",c+1);
                   else if (j==n) fprintf(g,"%ld",n*n);
                   else if (j<k) fprintf(g,"%ld",c);
                if (i==2) 
                   if (j==1) fprintf(g,"%ld",k);
                   else fprintf(g,"%ld",c-1);
                if (i>2) fprintf(g,"%ld",c-1);
                }
             if (k%2==1 && n%2==1)
                {
                //prima linie; sari peste k si pe ultima poz pui n^2
                if (i==1)
                   if (j<k) fprintf(g,"%ld",c);
                   else if (j>=k && j<=n-1) fprintf(g,"%ld",c+1);
                   else if (j==n) fprintf(g,"%ld",n*n);
                //liniile pare
                if (i%2==0 && i!=n-1)
                   if (j==n) fprintf(g,"%ld",c+n);
                   else fprintf(g,"%ld",c);
                else if (i%2==0) fprintf(g,"%ld",c);
                //liniile impare intre 3 si n-2
                if (i%2==1 && i>=3 && i<=n-2) fprintf(g,"%ld",c-1);
                //linia n
                if (i==n)
                   if (j==1) fprintf(g,"%ld",k);
                   else fprintf(g,"%ld",c-1);
                }
             }
         fprintf(g,"\n");
         }
     fclose(g);
}

int main()
{
    citire();
    calculeaza();
    return 0;
}