Cod sursa(job #1754671)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 8 septembrie 2016 15:33:50
Problema Tablete Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO

int N, K, ind;
int a[1005][1005];
bool f[1000005];

int getNext()
{
    while(f[ind] == 1)
        ind++;
    f[ind] = 1;
    return ind;
}

void solve(int N, int K)
{
    memset(f, 0, sizeof(f));
    memset(a, 0, sizeof(a));
    ind = 1;
    int val = N * K;
    if(val % 2 == 1)
        val++;
    for(int i = 1; i <= N; i++)
    {
        a[i][K] = val - 2 * (N - i);
        f[ a[i][K] ] = 1;
    }

    for(int i = 1; i <= N; i++)
        for(int j = 1; j < K; j++)
            a[i][j] = getNext();

    for(int i = 1; i <= N; i++)
        for(int j = K + 1; j <= N; j++)
            a[i][j] = getNext();

    for(int i = 1; i <= N; i++, printf("\n"))
        for(int j = 1; j <= N; j++)
            printf("%d ", a[i][j]);
}

bool verify(int N, int K)
{
    bool ok = 1;
    for(int i = 1; i <= N; i++)
    {
        int lst = 0;
        for(int j = 1; j <= N; j++)
        {
            if(a[i][j] < 1 || a[i][j] > N * N)  ok = 0;
            if(a[i][j] < lst)   ok = 0;
        }
    }
    for(int i = 1; i <= N; i++)
        if(a[i][K] % 2 == 1)    ok = 0;

    for(int i = 1; i <= N * N; i++)
        if(!f[i])   ok = 0;

    return ok;
}

int main()
{
    #ifdef FILE_IO
    freopen("tablete.in", "r", stdin);
    freopen("tablete.out", "w", stdout);
    #endif

    int N, K;
    scanf("%d%d", &N, &K);
    solve(N, K);

    return 0;
}