N-Queen problem tramite uso di stack - tecnica BACKTRACKING

di il
7 risposte

N-Queen problem tramite uso di stack - tecnica BACKTRACKING

Ciao! Sono nuovo nel sito, vorrei chiedere se qualcuno può aiutarmi a capire dov'è l'errore nel seguente programma. Esso implementa la risoluzione del problema di inserimento di n regine in una scacchiera di n lati attraverso l'utilizzo di stack e la tecnica del backtracking. Grazie

file.h

#ifndef LAB8_H_
#define LAB8_H_

struct queen {
int riga;
int colonna;
};

template <class Item>
class Stack
{
public:
Stack(int);
~Stack() {delete [] stackPtr;}
bool push(Item &);
bool pop(Item &);
bool conflict(Stack<Item>&, queen &);
void print(Stack<Item>,int);
bool empty() const {return top == -1;}
bool full() const {return top == size - 1;}
Item TOP();
private:
int top;
Item *stackPtr;
int size;
};


#endif /* LAB8_H_ */



file.cpp

#include <iostream>
#include "LAB8.h"
using namespace std;

template <class Item>
Stack<Item>::Stack(int numero)
{
size = numero;
top = -1;
stackPtr = new Item[size];
}

template <class Item>
bool Stack<Item>::push(Item &r)
{
if(!full())
{
stackPtr [++top] = r;
return true;
}
return false;
}

template <class Item>
bool Stack<Item>::pop(Item &r)
{
if(!empty())
{
r=stackPtr[top--];
return true;
}
return false;
}

template <class Item>
Item Stack<Item>::TOP()
{
return stackPtr[top];
}

template <class Item>
bool conflict(Stack<Item> &S,queen &Q)
{
while(!S.empty())
{
Stack<Item> scopia(24);
scopia = S;
for(int j=0;j<S.TOP().riga;j++)
{
if(Q.riga==S.TOP().riga)
return true;
if(Q.colonna==S.TOP().colonna)
return true;
//diagonale principale basso-alto'/'
if(S.TOP().riga - Q.riga == S.TOP().colonna - Q.colonna)
return true;
//diagonale secondaria alto-basso'\'
if(Q.colonna - S.TOP().colonna == S.TOP().riga - Q.riga)
return true;
S.pop(Q);
}
S = scopia;
}
return false;
}

template <class Item>
void print(Stack<Item> S,int numero)
{
for(int i=0;i<numero;i++)
{
queen Q;
cout << "Regina numero " << numero - i << "\n";
cout << "riga: " << S.TOP().riga << "\n";
cout << "colonna: " << S.TOP().colonna << "\n";
S.pop(Q);
}
}

int main()
{
int numeroregine = 1;
cout << "Inserire il numero n di righe/colonne: ";
cin >> numeroregine;
queen q;
q.riga=1;
q.colonna=1;
Stack<queen> s(numeroregine);
bool successo = false;
s.push(q);
while(!successo && !s.empty())
{
if(conflict(s,q))
{
while(!s.empty() || s.TOP().colonna != numeroregine)
s.pop(q);
if(!s.empty())
{
q.colonna=s.TOP().colonna + 1;
s.push(q);
}
}
else if(!conflict(s,q) && s.TOP().riga==numeroregine)
successo = true;
else
{
q.riga=s.TOP().riga+1;
q.colonna=1;
s.push(q);
}
}
if(successo)
{
cout << "\nRegine inserite:\n\n";
print(s,numeroregine);
}
return 0;
}

7 Risposte

  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    I template devono stare tutti nel .h non ci deve essere sviluppo in un presunto file cpp. Poi ragazzi fatte esercizi con template e non mi sapete usare il debugger? E leggere il regolamento e usare i code tags? Un forum non é servizio clienti per trovare bug e compilare il programma a posto vostro. Chi é quel prof che usa i template e li sviluppa in cpp?
  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    Scusate, ma l'errore commesso qual è?l'implementazione delle funzioni con i template nel file c++?
    sarei curioso di capire....
    Grazie
  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    Si. I template devo stare tutte nel header non ci dovrebbe essere un file cpp di sviluppo. Poi sinceramente non ho visto oltre visto l'interesse dell'utente a farsi aiutare.
  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    Mi permetto con tanta riverenza di far presente che anche a me fanno implementare i programmi in questo modo, cioè header con sola specificazione delle funzioni; poi nel file.cpp mettiamo l'implementazione delle funzioni con template e in più un file di prova?
    Possibile che sia un'altro l'errore?
    Non fucilatemi
    Grazie
  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    Io non sono l'inventore del linguaggio C++ ma ho letto un po di standard. Se controlli tutte le implementazioni delle classi STL vedrai che sono dei template sviluppati solo nel header. Se guardi le librerie boost sono implementate nello stesso modo. Quindi non é un mio vizio ma giá definito nello standard. Se poi qualche compilatore vuole deviare dallo standard non é compito nostro saperlo.

    Leggi anche qua
  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    Non è che volevo insinuare qualcosa comunque...
    Grazie per la veloce risposta.
  • Re: N-Queen problem tramite uso di stack - tecnica BACKTRACKING

    Figurati non ho compreso nessun doppio senso. Alla prossima.
Devi accedere o registrarti per scrivere nel forum
7 risposte