вот код программы, из книги олимпиадное программирование. Он должен решать задачу о количестве способов разместить 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
В книге у вас даны слишком мелкие массивы для диагоналей. Надо
int diag1[2*n-1]; int diag2[2*n-1];
(ну сами посчитайте число диагоналей). Вот они у вас и перезаписываются...
Ну, и выводить ans
нужно не в search
, а по окончании.
Вот работающая программа - https://ideone.com/J47BYq
P.S. Скачал книгу - с нее обвинение снимается, там размер diag
не указан, это уже чисто ваша вина...
Как можно заменить все boost::bind на лямбды в коде ниже??? Почему при попытке в функции accept заменить boost::bind на std::bind, компилятор выдает ошибку No matching...
Какого типа данных возвращаемое значение boost::bind? Я хочу сделать функцию, которая будет принимать в себя результат работы boost::bind, но я не знаю...