Cod sursa(job #2782910)

Utilizator DordeDorde Matei Dorde Data 13 octombrie 2021 14:21:29
Problema Dame Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.62 kb
#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;
}