Функция завершается не дойдя до return с++

173
26 июня 2022, 07:40

вот код программы, из книги олимпиадное программирование. Он должен решать задачу о количестве способов разместить n ферзей на доске n*n чтобы они не били друг друга (перебор с возвратом) суть в том что код ничего не выводит хотя должен вывести ans; код:

#include <iostream>
#include <vector>
using namespace std;
const int n = 4;
int col[n]; int diag1[n]; int diag2[n];
int ans = 0;
void search(int y) {
    if (y == n) {
        ans++;
        cout << ans<<endl;
        return;
    }
    for (int x = 0; x < n; x++) {
        if (col[x] || diag1[x + y] || diag2[x - y + n - 1])continue;
        col[x] = diag1[x + y] = diag2[x - y + n - 1] = 1;
        search(y + 1);
        col[x] = diag1[x + y] = diag2[x - y + n - 1] = 0;
    }
}
int main() {

    search(0);

    return 0;
}

Книга https://books.google.by/books/about/%D0%9E%D0%BB%D0%B8%D0%BC%D0%BF%D0%B8%D0%B0%D0%B4%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC.html?id=34KzDwAAQBAJ&printsec=frontcover&source=kp_read_button&redir_esc=y#v=twopage&q&f=false cтраница 33-35

Answer 1

В книге у вас даны слишком мелкие массивы для диагоналей. Надо

int diag1[2*n-1]; int diag2[2*n-1];

(ну сами посчитайте число диагоналей). Вот они у вас и перезаписываются...

Ну, и выводить ans нужно не в search, а по окончании.

Вот работающая программа - https://ideone.com/J47BYq

P.S. Скачал книгу - с нее обвинение снимается, там размер diag не указан, это уже чисто ваша вина...

READ ALSO
Как использовать лямбды вместе с boost.asio?

Как использовать лямбды вместе с boost.asio?

Как можно заменить все boost::bind на лямбды в коде ниже??? Почему при попытке в функции accept заменить boost::bind на std::bind, компилятор выдает ошибку No matching...

181
Что возвращает boost::bind?

Что возвращает boost::bind?

Какого типа данных возвращаемое значение boost::bind? Я хочу сделать функцию, которая будет принимать в себя результат работы boost::bind, но я не знаю...

246