Cod sursa(job #870533)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 3 februarie 2013 16:00:32
Problema Tablete Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int M[1010][1010];

int main()
{
    int N, K, i, j, now = 0;

    in >> N >> K;

    if (!((N | K) & 1)){
        for (i = 1; i <= N; i ++, out << "\n")
            for (j = 1; j <= N; j ++)
                out << ++ now << " ";

        return 0;
    }

    if (!(N & 1) && (K & 1)){
        M[1][1] = 1;
        M[2][1] = K;

        for (i = 2; i <= N; i ++){
            M[1][i] = M[1][i - 1] + 1;

            if (i == K)
                M[1][i] ++;
        }

        for (i = 2; i <= N; i ++)
            M[2][i] = M[1][i] + N;

        for (i = 3; i <= N; i ++)
            for (j = 1; j <= N; j ++)
                M[i][j] = M[i - 1][j] + N;

        for (i = N; i >= K; i --)
            M[N][i] = M[N][i - 1];

        M[N][K - 1] --;
        M[N - 1][N] = M[N][K] + 1;

        for (i = 1; i <= N; i ++, out << "\n")
            for (j = 1; j <= N; j ++)
                out << M[i][j] << " ";

        return 0;
    }

    if ((N & 1) && !(K & 1)){
        for (i = 1; i <= N; i ++)
            for (j = 1; j <= N; j ++)
                M[i][j] = ++ now;

        if (K == 2){
            for (i = 2; i <= N; i += 2){
                swap (M[i][2], M[i - 1][N]);
                swap (M[i][1], M[i][2]);
            }
        }
        else{
            for (i = 2; i <= N; i += 2){
                swap (M[i][K], M[i - 1][N]);
                swap (M[i][1], M[i][K]);
                swap (M[i][K], M[i][K - 1]);
                swap (M[i][K - 1], M[i][K - 2]);
            }
        }

        for (i = 1; i <= N; i ++, out << "\n")
            for (j = 1; j <= N; j ++)
                out << M[i][j] << " ";

        return 0;
    }

    M[1][K] = K + 1;

    for (i = 1; i <= N; i ++){
        if (i == K){
            now += 2;

            continue;
        }

        M[1][i] = ++ now;
    }

    M[2][1] = K;

    for (i = 2; i <= N; i ++)
        M[2][i] = i + N;

    for (i = 3; i < N; i ++)
        for (j = 1; j <= N; j ++)
            M[i][j] = M[i - 2][j] + (2 * N);

    now = M[N - 1][N];

    for (i = 1; i <= N; i ++)
        M[N][i] = (now ++);

    swap (M[N - 1][N], M[N][K + 1]);

    for (i = K + 1; i < N; i ++)
        M[N][i] = M[N][i + 1];

    M[N][N] = N * N;

    for (i = 1; i <= N; i ++, out << "\n")
            for (j = 1; j <= N; j ++)
                out << M[i][j] << " ";

    return 0;
}