Cod sursa(job #356607)

Utilizator digital_phreakMolache Andrei digital_phreak Data 15 octombrie 2009 15:41:54
Problema Dame Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <vector>
#include <fstream>
#define MAXN 1010
using namespace std;

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

class Dame {
	public:
		vector <int> positions;
		Dame(int N) {
			if ((N % 2 == 0) && (N % 6 != 2)) {
				positions = Even_Queens_1(N);
			} else 
			if (N % 2 == 0) {
				positions = Even_Queens_2(N);
			} else {
				positions = Odd_Queens(N);
			}
		}
	private:
		vector <int> Even_Queens_1(int N) {
			vector <int> result(N);
			for (int R = 1; R <= N/2 ; ++R) {
				result[R-1] = 2*R;
			}				
			for (int R = N/2 + 1; R <= N; ++R) {
				result[R-1] = 2 * R - N - 1;
			}
			return result;
		}
		vector <int> Even_Queens_2(int N) {
			vector <int> result(N);
			for (int R = 1; R <= N/2 ; ++R) {
				result[R-1] = Queen_Mod(R,N) + 1;
			}
			for (int R = N/2 + 1; R <= N; ++R) {
				result[R-1] = N - Queen_Mod(N - R + 1, N);
			}
			return result;
		}
		vector <int> Odd_Queens(int N) {
			Dame Even(N-1);
			vector<int> result(N);
			for (int R = 0 ; R <= N-1; ++R) {
				result[R] = Even.positions[R];
			}
			result[N-1] = N;
			return result;
		}
		int Queen_Mod(int R,int N) {
			return ((2 * R + N/2 - 3) % N);
		}
};

int main() {
	int N;
	fin >> N;
	
	if (N >= 4) {
	Dame d(N);
	fout << N << "\n";
	for (int i=1;i<=N;++i)
		fout << i << " " << d.positions[i-1] << "\n";
	} else {
		fout << 0 << "\n";
	}
	fin.close();
	fout.close();

	return 0;
}