Cod sursa(job #2782904)

Utilizator DordeDorde Matei Dorde Data 13 octombrie 2021 13:50:19
Problema Dame Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.39 kb
#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;
}