Cod sursa(job #2353079)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 23 februarie 2019 20:53:35
Problema Tablete Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
#include <cmath>

#define MAX 1005
using namespace std;

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

int nrI[MAX * MAX / 2 + 1], nrP[MAX * MAX / 2 + 1], afis[MAX][MAX];
bool usedP[MAX * MAX];

int main()
{
    int n, k;
    fin >> n >> k;

    n *= n;
    int nri = 0, nrp = 0;
    for(int i = 1; i <= n; ++i)
        if(i % 2 == 1)
            nrI[++nri] = i;
        else
            nrP[++nrp] = i;

    int nrL = sqrt(n);
    int pPar = 1;
    int p1 = 1;
    int p2 = nri;
    for(int i = 1; i <= nrL; ++i)
    {
        if(p1 > p2)
        {
            for(int j = 1; j <= nrL; ++j)
            {
                while(usedP[pPar])
                    ++pPar;
                afis[i][j] = nrP[pPar];
                usedP[pPar] = 1;
            }
        }
        else
        {
            bool ok = 0;
            for(int j = 1; j <= k - 1; ++j)
            {
                if(p1 > p2)
                {
                    p1--;
                    ok = 1;
                    for(int jj = j; jj < k; ++jj)
                        usedP[p1] = 1, afis[i][jj] = nrP[p1++];
                    afis[i][k] = nrP[p1];
                    usedP[p1] = 1;
                    ++p1;
                    break;
                }
                afis[i][j] = nrI[p1++];
            }
            if(!ok)
            {
                afis[i][k] = nrP[p1 - 1];
                usedP[p1 - 1] = 1;
            }
            for(int j = nrL; j > k; --j)
            {
                if(p1 >= p2)
                {
                    int adaug = 0;
                    if(p1 == p2)
                        afis[i][k + 1] = nrI[p1], adaug = 1;
                    for(int jj = k + 1 + adaug; jj <= j; ++jj)
                        usedP[p1] = 1, afis[i][jj] = nrP[p1++];
                    break;
                }
                afis[i][j] = nrI[p2--];
            }
        }
    }

    for(int i = 1; i <= nrL; ++i)
        for(int j = 1; j <= nrL; ++j)
            fout << afis[i][j] << " \n"[j == nrL];
    return 0;
}