Pagini recente » Cod sursa (job #1585917) | Cod sursa (job #2174078) | Cod sursa (job #333508) | Cod sursa (job #1586217) | Cod sursa (job #2782904)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f ("dame.in");
ofstream g ("dame.out");
int const N = 26;
bool v [N][N];
int n;
vector <pair <int , int> > dame;
int Line [N] , Col [N] ,D1 [N] , D2 [N];
int getd1 (int line , int col){
int dif = min (line, col) - 1;
line -= dif;
col -= dif;
if (line == 1)
return col;
return line - 1 + n;
}
int getd2 (int line , int col){
int dif = min (line - 1 , n - col);
line -= dif;
col += dif;
if (line == 1)
return n - col + 1;
return n + line - 1;
}
bool check (int line , int col){
if (Line [line] || Col [col] || D1 [getd1 (line , col)] || D2 [getd2 (line , col)])
return false;
return true;
}
bool check2 (int line , int col){
///st
for(int i = 1 ; i <= col ; ++ i)
if (v [line][i])
return false;
///st sus
for(int i = line , j = col ; i && j ; -- i , -- j)
if (v [i][j])
return false;
///st jos
for(int i = line , j = col ; i <= n && j ; ++ i , -- j)
if (v [i][j])
return false;
return true;
}
bool pp;
const int in = 24;
void out (){
for(int i = 1 ; i <= n ; ++ i){
for(int j = 1 ; j <= n ; ++ j)
g << v [i][j] << ' ';
g << '\n';
}
}
bool checkq (int line , int col){
///st si dr
for(int i = 1 ; i <= n ; ++ i)
if (! (i == col) && v [line][i])
return false;
///sus jos
for(int i = 1 ; i <= n ; ++ i)
if (! (i == line) && v [i][col])
return false;
///st sus
for(int i = line - 1 , j = col - 1 ; i && j ; -- i , -- j)
if (v [i][j])
return false;
//st jos
for(int i = line + 1 , j = col - 1 ; i <= n && j ; ++ i , -- j)
if (v [i][j])
return false;
///dr sus
for(int i = line - 1 , j = col + 1 ; i && j <= n ; -- i , ++ j)
if (v [i][j])
return false;
//dr jos
for(int i = line + 1 , j = col + 1 ; i <= n && j <= n ; ++ i , ++ j)
if (v [i][j])
return false;
return true;
}
bool validate (){
for(int i = 1 ; i <= n ; ++ i)
for(int j = 1 ; j <= n ; ++ j)
if (v [i][j] && ! checkq (i , j))
return false;
return true;
}
void bkt (int k){
if (k == n + 1){
g << dame.size () - v [0][0] << '\n';
if (v [0][0]){
for (int i = 1 ; i < n ; ++ i)
for(int j = 2 ; j <= n ; ++ j)
if (v [i][j])
g << i << ' ' << j - 1 << '\n';
exit (0);
}
for(int i = 1 ; i <= n ; ++ i)
for(int j = 1 ; j <= n ; ++ j)
if (v [i][j])
g << i << ' ' << j << '\n';
exit (0);
}
for(int i = n - 1 ; i ; -- i )
if (i != k && check2 (i , k)){
v [i][k] = 1;
dame.push_back (make_pair (i , k));
bkt (k + 1);
v [i][k] = 0;
dame.pop_back ();
}
}
int main()
{
f >> n;
if (n > 25){
return 0;
}
if (n < 8){
g << 0;
return 0;
}
if (n % 2 == 0)
v [0][0] = 1 , ++ n;
v [n][1] = 1;
dame.push_back (make_pair (n , 1));
bkt (2);
return 0;
}