Cod sursa(job #238488)

Utilizator alexandru92alexandru alexandru92 Data 2 ianuarie 2009 12:54:41
Problema Tablete Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<stdio.h>
#define InFile "tablete.in"
#define OutFile "tablete.out"
#define NMax  1000
int  uz[NMax*NMax],n,K;
long  a[NMax][NMax];
FILE *fin=freopen(InFile,"rt",stdin),*fout=freopen(OutFile,"wt",stdout);
void out()
  {
   for(int i=1;i<=n;i++)
    {for(int j=1;j<=n;j++) printf("%ld ",a[i][j]);
     printf("\n");
    }
  }
void Mat()
   {long  nr,i,j;
    int ok;
    a[1][1]=1; uz[1]=1;
    for(i=1;i<=n;i++)
       {
        if(i>1)
          {ok=1;
           for(nr=i-1;nr<=(i-1)*n&&ok;nr++)
              if(uz[nr]==0) ok=0;
           if(ok) nr=a[i-1][n]+1;
             else nr--;
           a[i][1]=nr; uz[nr]=1;
         }
       for(j=2;j<=n;j++)
           if(j!=K)
             {nr=a[i][j-1]+1;
              while(uz[nr]) nr++;
              a[i][j]=nr;
              uz[nr]=1;
             }
              else {nr=a[i-1][K]+2;
                    while(uz[nr]) nr+=2;
                    a[i][K]=nr;
                    uz[nr]=1;
                    }
       }
    if(a[n][n]>n*n)
      {ok=1;
       for(i=1;i<=n*n&&ok;i++)
         if(uz[i]==0) ok=0;
       a[n][n]=i-1; uz[i-1]=1;
      }
  }
void valid()
   {int i,j;
    long nr;
    if(a[n][n]<a[n][n-1])
      {a[n-1][n]+=a[n][n];
       a[n][n]=a[n-1][n]-a[n][n];
       a[n-1][n]-=a[n][n];
       i=1; nr=a[n][n];
       while(i<=n&&a[n][n]>a[n][i]) i++;
       if(i<n)
         {
          for(j=n;j>=i;j--) a[n][j+1]=a[n][j];
          a[n][i]=nr;
         }
      }
   }
int main()
  {long  i,j;
   scanf("%d %d",&n,&K);
   fclose(fin);
   for(i=1;i<=n;i++)
    for(j=1;j<=n;j++) a[i][j]=i*j;
   if(K%2==0) out();
     else
        {
         Mat();
         valid();
         out();
        }
   fclose(fout);
   return 0;
  }