Загрузка...

Помогите с задачей

Тема в разделе C/C++ создана пользователем impelix 27 сен 2022. 208 просмотров

  1. impelix
    impelix Автор темы 27 сен 2022 5 28 ноя 2021
    Дана шахматная доска размера n×n. Найдите количество всевозможных различных расстановок n ферзей на этой доске. При этом никакие два ферзя не должны "бить" друг друга.
    я пытался решить ее, но суть в том что надо именно рекурсивно.

    [CODE=c++]#include <vector>
    #include <iostream>
    using namespace std;
    int desk[10][10];
    int n, var = 0;
    void ferz(int j) {
    for (int i = 0; i < n; ++i) {
    desk[i][j] = 1;
    ferz(j + 1);
    desk[i][j] = 0;
    var++;
    }
    if (j == n) {
    var++;
    }
    else{
    cout << var;
    }
    }
    int main() {
    cin >> n;
    ferz(0);
    }[/CODE]

    если не сложно то добавьте несколько комментариев
    спасибо
     
  2. brediska
    brediska 3 окт 2022 Заблокирован(а) 2794 30 май 2021
    impelix,
    C
    #include<iostream> 
    using namespace std;
    unsigned size;

    inline bool strike(const pair<int, int>& x, const pair<int, int>& y)
    {
    if (x.first == y.first || x.second == y.second) return false;
    if (abs(x.first - y.first) == abs(x.second - y.second)) return false;
    return true;
    }
    void finder(pair<int, int> x, pair<int, int> y, size_t& var)
    {
    static pair<int, int> max_c = { ::size - 1, ::size - 1 };
    if (x == max_c && y == max_c) return;
    var += (x != y && strike(x, y));
    y.second++;
    if (y.second == ::size) { y.second = 0; y.first++; }
    if (y.first == ::size) { y.first = 0; x.second++; }
    if (x.second == ::size) { x.second = 0; x.first++; }
    finder(x, y, var);
    }

    int main()
    {
    cin >> ::size;
    size_t variations{};
    finder({ 0,0 }, { 0, 0 }, variations);
    cout << variations;
    }
     
Top
Загрузка...