Pagini recente » Cod sursa (job #907193) | Cod sursa (job #92859) | Cod sursa (job #1785180) | Cod sursa (job #1879685) | Cod sursa (job #2782911)
#include <fstream>
#include <vector>
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;
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 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;
}
vector <pair <int , int> > ans;
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 tmp_ , mx;
void bkt3 (int k , int q){
if (k == n + 1){
if (q > mx){
mx = q;
ans = dame;
}
return;
}
for(int i = 1 ; i <= n ; ++ i){
if (checkq (i , k)){
v [i][k] = 1;
dame.push_back (make_pair (i , k));
bkt3 (k + 1 , q + 1);
v [i][k] = 0;
dame.pop_back ();
}
else{
bkt3 (k + 1 , q);
}
}
}
void solve0 (){
bkt3 (1 , 0);
g << ans.size () << '\n';
for(int i = 0 ; i < ans.size () ; ++ i){
g << ans [i].first << ' ' << ans [i].second << '\n';
v [ans [i].first][ans [i].second] = 1;
}
exit (0);
for(int i = 1 ; i <= n ; ++ i){
for(int j = 1 ; j <= n ; ++ j)
g << v [i][j] << ' ';
g << '\n';
}
}
int main()
{
f >> n;
if (n > 25){
return 0;
}
if (n < 8){
solve0 ();
return 0;
}
if (n % 2 == 0)
v [0][0] = 1 , ++ n;
v [n][1] = 1;
dame.push_back (make_pair (n , 1));
bkt (2);
g << ans.size () << '\n';
for(auto y : ans){
g << y.first << ' ' << y.second << '\n';
v [y.first][y.second] = 1;
}
exit (0);
g << '\n';
for(int i = 1 ; i <= n ; ++ i){
for(int j = 1 ; j <= n ; ++ j)
g << v [i][j] << ' ';
g << '\n';
}
return 0;
}