Cod sursa(job #1348319)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 19 februarie 2015 17:16:29
Problema Dame Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>

using namespace std;

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

int N, lista[1002], rest, start_impar;

int main() {
    fin >> N;

    // Inseram elementele pare

    for(int i = 2; i <= N; i += 2) {
        lista[++lista[0]] = i;
    }

    rest = N % 12;

    // Daca restul este 3 sau 9, se muta 2 la sfarsitul listei

    if(rest == 3 || rest == 9) {
        for(int i = 2; i <= lista[0]; i++) {
            lista[i - 1] = lista[i];
        }

        lista[lista[0]] = 2;
    }

    // Inseram elementele impare

    start_impar = lista[0] + 1;

    for(int i = 1; i <= N; i += 2) {
        lista[++lista[0]] = i;
    }

    // Daca restul este 8, interschimbam perechile de numere impare (3,1,7,5..)

    if(rest == 8) {
        for(int i = start_impar; i <= lista[0]; i += 2) {
            swap(lista[i], lista[i + 1]);
        }
    }

    // Daca restul este 2, interschimbam 1 cu 3 si 5 se muta la sfarsitul listei

    if(rest == 2) {
        swap(lista[start_impar], lista[start_impar + 1]);

        for(int i = start_impar + 3; i <= lista[0]; i++) {
            lista[i - 1] = lista[i];
        }

        lista[lista[0]] = 5;
    }

    // Daca restul este 3 sau 9, mutam 1 si 3 la finalul listei

    if(rest == 3 || rest == 9) {
        for(int i = start_impar + 2; i <= lista[0]; i++) {
            lista[i - 2] = lista[i];
        }

        lista[lista[0] - 1] = 1;
        lista[lista[0]] = 3;
    }

    // Afisam sol

    if(N == 1) {
        fout << "1\n1 1\n";
        return 0;
    }
    if(N == 2) {
        fout << "1\n1 1\n";
        return 0;
    }
    if(N == 3) {
        fout << "2\n1 1\n2 3\n";
        return 0;
    }

    fout << N << '\n';

    for(int i = 1; i <= N; i++) {
        fout << i << ' ' << lista[i] << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}