Cod sursa(job #1880361)

Utilizator Coroian_DavidCoroian David Coroian_David Data 15 februarie 2017 18:24:56
Problema Tablete Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

const int buffSize = 4096;

int crChar = 4096;

char buff[4100];

bool isDigit[300];

void getIsDigit()
{
    int i;
    for(i = '0'; i <= '9'; i ++)
        isDigit[i] = 1;
}

void refillBuff()
{
    crChar = 0;

    fread(buff, 1, buffSize, f);
}

char getCr()
{
    if(crChar == 4096)
        refillBuff();

    return buff[crChar ++];
}

int getNr()
{
    char c = getCr();

    int nr = 0;
    int sign = 1;

    while(isDigit[c] == 0 && c != '-')
        c = getCr();

    while(c == '-')
    {
        c = getCr();

        sign *= (-1);
    }

    while(isDigit[c] == 1)
    {
        nr = nr * 10 + c - '0';

        c = getCr();
    }

    return nr * sign;
}

int n, m;

int a[1001][1001];

int urm[1000001];
int ant[1000001];

int lst;

void readFile()
{
    getIsDigit();

    f = fopen("tablete.in", "r");

    n = getNr();
    m = getNr();

    fclose(f);
}

int firstUnused(int cod)
{
    if(cod == 0)
    {
        int aux = lst;

        lst = urm[lst];

        return aux;
    }

    if(cod == 1)
    {
        int p = lst;

        while(p % 2 == 1)
        {
            p = urm[p];
        }

        if(p == lst)
        {
            int aux = lst;

            lst = urm[lst];

            return aux;
        }

        else
        {
            urm[ant[p]] = urm[p];

            return p;
        }
    }
}

void solve()
{
    int i, j;

    for(i = 1; i <= n * n; i ++)
    {
        urm[i] = i + 1;
        ant[i] = i - 1;
    }

    urm[n * n] = 0;
    ant[1] = 0;

    lst = 1;

    int k = m;
    for(i = 1; i <= n; i ++)
    {
        for(j = 1; j < k; j ++)
            a[i][j] = firstUnused(0);

        a[i][k] = firstUnused(1);

        for(j = k + 1; j <= n; j ++)
            a[i][j] = firstUnused(0);

    }
}

void printFile()
{
    g = fopen("tablete.out", "w");

    int i, j;
    for(i = 1; i <= n; i ++)
    {
        for(j = 1; j <= n; j ++)
            fprintf(g, "%d ", a[i][j]);

        fprintf(g, "\n");
    }

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}