#include
using namespace std;
bool dziala (int n, bool ** tab, int k){
for(int i=0; i < n ; i++){
if (pole (k,i) nie jest szachowane){//dorobić sprawdzanie czy można ustawić działo.
tab[k][i]==true;
if (k==n-1){
return true;
}
if (dziala(n,tab,k+1)){
return true;
}
else {
tab[k][i]==false;
}
}//if
}//for
return false; //jeśli funkcja przejży wszystkie pola i nie znajdzie rozwiązania zwraca false.
}//dziala
int main() {
return 0;
}
Czy możecie mi powiedzieć, czy dobrze kombinuję i ewentualnie podpowiedzieć jak sprawdzić czy można w danym miejscu postawić działo?
Raczej Twój kod nie odnosi się do wyszukiwania najmniejszej liczby żołnierzy. Każde działo stoi w osobnym polu i rzędzie. Więc liczby oznaczające rząd na wyjściu muszą wszystkie się różnić. Najprostsze do napisania to wyznaczenie wszystkich kombinacji ustawienia w rzędach, obliczenie sumy żołnierzy potrzebnych do ich ustawienia i wybranie kombinacji o ich najmniejszej sumie. Ale to raczej metoda brutal force, być może da się wymyślić jakiś mniej złożony obliczeniowo algorytm. Zależy po co Ci ten program na konkurs czy też zadanie domowe.
Jak słusznie zauważył mikolaj_s musisz minimalizować funkcję żołnierzy. Jednak jego sposób dla danych rzedu 10^3 będzie wykonywał się dłużej niż cykl życia naszego wszechświata (inaczej: nie udałoby się obejrzeć wyników przy założeniu odpalenia komputera z takim algorytmem zaraz po wielkim wybuchu)
Poza tym mam wrażenie, że nie rozumiesz treści - w skrócie musisz wybrać dokładnie jedną liczbę z każdej kolumny tak by suma była jak najmniejsza, przy czym wybranie liczby (k,s) (kolumna, szereg) blokuje ci też cały szereg. Czyli zachłannie nie przejdzie, bo czasem możesz wybrać w danym szeregu nie najlepszą opcję, aby nie zablokować najlepszej opcji z innej kolumny. Zapoznaj się z paradygmatem programowania liniowego i minimalizacji funkcji. Mówiąc prościej to zwykły klasyczny problem na algorytm dynamiczny.