Cod sursa(job #231216)

Utilizator mika17Mihai Alex Ionescu mika17 Data 14 decembrie 2008 11:50:05
Problema Tablete Scor 0
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Clasele 9-10 Marime 1.34 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("tablete.in");
ofstream fout("tablete.out");

const int NMAX = 1000;

int N,K,A[NMAX + 1][NMAX + 1];
bool este[NMAX*NMAX + 1],gata,nopos;


void gen_t(int sq)
{
 if(sq == N*N + 1)
 {
  gata = true;
 }
  else
  {
   int row = (sq-1) / N + 1;
   int col = (sq-1) % N + 1;

   if(col == K) gen_t(sq + 1);
   
    else
    {
      for(int i = A[row][col-1] + 1; !gata && i <= N*N; ++i)
        if(!este[i])
        {
         if(col < K && i > A[row][K]) break;
         este[i] = true;
         A[row][col] = i;
         gen_t(sq + 1);
         este[i] = false;
        }
    }
  }
}

void afis()
{
       for(int i = 1; i <= N; ++i) {
         for(int j = 1; j <= N; ++j)
           fout<< A[i][j] <<' ';
         fout<<'\n';
        }
}


void gen_l(int r)
{
        if(r == N + 1)
        {
           gen_t(1);
        }
         else
        {

        for(int i = A[r-1][K] + 2; !gata && i <= N*N - (N-K); i+=2)
         if(!este[i])
         {
          A[r][K] = i;
          este[i] = true;
          gen_l(r  + 1);
          este[i] = false;
         }

        }
}

int main()
{
        fin>>N>>K;

        A[0][K] = K&1 ? K - 1 : K - 2;
        
        gen_l(1);

        afis();

        return 0;
}