Cod sursa(job #2119200)

Utilizator benjamin2205Zeic Beniamin benjamin2205 Data 31 ianuarie 2018 19:49:26
Problema Dame Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("dame.in");
ofstream g ("dame.out");

int n;

void citire();

// In cazul in care restul impartirii la 6 e 2,
// se inverseaza 1 cu 3 in lista de impare si se
// trece 5 la final
void afisareRest2() {
    // i este contorul care merge de la 1 la n
    // j merge pe impare respectiv pare
    int  i, j;
    g << n << '\n';

    for (i = 1, j = 2; j <= n && i <= n; ++i, j += 2) {
        g << i << ' ' << j << '\n';
    }

    // Afisarea pentru impare
    g << i << ' ' << 3 << '\n';
    ++i;
    g << i << ' ' << 1 << '\n';
    ++i;

    for (j = 7; j <= n && i <= n; ++i, j += 2) {
        g << i << ' '  << j << '\n';
    }

    g << i << ' ' << 5;
}
// In cazul in care restul impartirii la 6 e 3,
// se muta 2 la finalul listei de pare si se muta
// 1 si 3 la sfarsitul listei de impare
void afisareRest3() {
    int i, j;

    g << n << '\n';

    for (i = 1, j = 4; j <= n && i <= n; ++i, j += 2) {
        g << i << ' ' << j << '\n';
    }

    g << i << ' ' << 2 << '\n';
    ++i;

    for (j = 5; j <= n && i <= n; ++i, j += 2) {
        g << i << ' ' << j << '\n';
    }

    g << i << ' ' << 1 << '\n';
    ++i;
    g << i << ' ' << 3 << '\n';
}

void afisareGenerala() {
    int i, j;
    g << n << '\n';

    for (i = 1, j =2; j <= n && i <= n; ++i, j += 2) {
        g << i << ' ' << j << '\n';
    }

    for (j = 1; j <=n && i <= n; ++i, j += 2) {
        cout << i << ' ' << j << '\n';
        g << i << ' ' << j << '\n';
    }
}
void afisareCazParticular() {
    if (n == 3) {
        g << 2 << '\n';
        g << 1 << ' ' << 1 << '\n';
        g << 2 << ' ' << 3;
    }
    else if (n == 2 || n == 1) {
        g << 1 << '\n';
        g << 1 << ' ' << 1;
    }
}

void decizie() {
    // Pentru tabla mai mica (strict) decat patru,
    // exista cazuri particulare
    if (n < 4) {
        afisareCazParticular();
    }
    // In cazul in care restul impartirii la 6 e 2,
    // se inverseaza 1 cu 3 in lista de impare si se
    // trece 5 la final
    else if (n % 6 == 2) {
        afisareRest2();
    }
    // In cazul in care restul impartirii la 6 e 3,
    // se muta 2 la finalul listei de pare si se muta
    // 1 si 3 la sfarsitul listei de impare
    else if (n % 6 == 3) {
        afisareRest3();
    }
    else {
        afisareGenerala();
    }
}

int main()
{
    citire();
    decizie();
    return 0;
}

void citire() { f >> n; }