Problem sa slagalicom?

Problem sa slagalicom?

offline
  • Pridružio: 29 Jun 2007
  • Poruke: 51
  • Gde živiš: Nis

Pozdrav svima Smile

Evo koda koji uspesno resava slagalicu 3x3 koju korisnik unese, e, ali je njegovo tzv. goal (finalno) stanje ovakvo:

0 1 2
3 4 5
6 7 8

a meni treba ovakvo:

1 2 3
8 0 4
7 6 5

0 - je pokretni blok

#include <iostream.h> #include <process.h> #include <conio.h> struct PoljeSlagalice {     PoljeSlagalice *levo;     PoljeSlagalice *desno;     PoljeSlagalice *ispod;     PoljeSlagalice *iznad;     int vrednost;     int pozicija;     PoljeSlagalice()     {         levo = NULL;         desno = NULL;         ispod = NULL;         iznad = NULL;     }         void copy(PoljeSlagalice *temp)     {         PoljeSlagalice *temp2 = this;         temp2->vrednost=temp->vrednost;         temp2->pozicija=temp->pozicija;                         if(temp->levo!=NULL)         {             temp2->levo->vrednost=temp->levo->vrednost;             temp2->levo->pozicija=temp->levo->pozicija;         }                 if(temp->desno!=NULL)         {             temp2->desno->vrednost=temp->desno->vrednost;             temp2->desno->pozicija=temp->desno->pozicija;         }                 if(temp->ispod!=NULL)         {                    temp2->ispod->vrednost=temp->ispod->vrednost;             temp2->ispod->pozicija=temp->ispod->pozicija;         }                 if(temp->iznad!=NULL)         {             temp2->iznad->vrednost=temp->iznad->vrednost;             temp2->iznad->pozicija=temp->iznad->pozicija;         }     } }; struct Leaves {     class Formacija *ptr;     Leaves *next;     int Index;     Leaves(int k)     {         next=NULL;         Index = k;     }     Leaves()     {         ptr=NULL;        } }; int static brojac=0; class LinkedList {     Leaves *head; public:     LinkedList(int j,Formacija *F)     {         head = new Leaves(j);         head->ptr=F;     }     inline void add(int k, Formacija *F)     {         Leaves *temp = head;         Leaves *temp2;         while(temp->next!=NULL)         {             temp = temp->next;         }         temp2=new Leaves(k);         temp->next=temp2;         temp2->ptr=F;     }     inline void del(int d)     {         Leaves *temp = head;         Leaves *prev = head;         if(temp==head && temp->Index==d)         {             head=temp->next;             delete temp;             return;         }                 else         {             while(temp->Index != d )             {                    prev = temp;                 temp = temp->next;             }                     prev->next= temp->next;             delete temp;             return;         }             }     Formacija *Searchcc(); }; LinkedList *Linked; int  brojac2=0; struct Leaves *X=new Leaves[8000]; class Formacija {     PoljeSlagalice *SlobodanBlok,*Broj1,*Broj2,*Broj3,*Broj4,*Broj5,*Broj6,*Broj7,*Broj8;     Formacija *GORE,*DOLE,*desno,*levo;     Formacija *testGORE,*testDOLE,*testdesno,*testlevo;         int C;     int NOM;         public:         int Function;     Formacija *Parent;     int heuristic;     int ZadnjiPotez;     Formacija()     {         Formacija *temp = this;           Linked = new LinkedList(brojac,temp);         SlobodanBlok= new PoljeSlagalice();         Broj1 = new PoljeSlagalice();         Broj2 = new PoljeSlagalice();         Broj3= new PoljeSlagalice();         Broj4= new PoljeSlagalice();         Broj5= new PoljeSlagalice();         Broj6= new PoljeSlagalice();         Broj7= new PoljeSlagalice();         Broj8= new PoljeSlagalice();                 GORE=NULL;         DOLE=NULL;         desno=NULL;         levo=NULL;         testGORE=NULL;         testDOLE=NULL;         testdesno=NULL;         testlevo=NULL;         NOM=0;         C=::brojac++;         Linked->add(C,temp);         temp->Parent=NULL;         temp->NOM=0;             }             Formacija(int x)     {         GORE=NULL;         DOLE=NULL;         desno=NULL;         levo=NULL;         SlobodanBlok= new PoljeSlagalice();         Broj1 = new PoljeSlagalice();         Broj2 = new PoljeSlagalice();         Broj3= new PoljeSlagalice();         Broj4= new PoljeSlagalice();         Broj5= new PoljeSlagalice();         Broj6= new PoljeSlagalice();         Broj7= new PoljeSlagalice();         Broj8= new PoljeSlagalice();                 SlobodanBlok->levo=NULL;         SlobodanBlok->desno=Broj1;         SlobodanBlok->iznad=NULL;         SlobodanBlok->ispod=Broj3;                     Broj1->levo=SlobodanBlok;         Broj1->desno=Broj2;         Broj1->iznad=NULL;         Broj1->ispod=Broj4;                 Broj2->levo=Broj1;         Broj2->desno=NULL;         Broj2->iznad=NULL;         Broj2->ispod=Broj5;                 Broj3->levo=NULL;         Broj3->desno=Broj4;         Broj3->iznad=SlobodanBlok;         Broj3->ispod=Broj6;                         Broj4->levo=Broj3;         Broj4->desno=Broj5;         Broj4->iznad=Broj1;         Broj4->ispod=Broj7;             Broj5->levo=Broj4;         Broj5->desno=NULL;         Broj5->iznad=Broj2;         Broj5->ispod=Broj8;                 Broj6->levo=NULL;         Broj6->desno=Broj7;         Broj6->iznad=Broj3;         Broj6->ispod=NULL;             Broj7->levo=Broj6;         Broj7->desno=Broj8;         Broj7->iznad=Broj4;         Broj7->ispod=NULL;         Broj7->pozicija=7;         Broj7->vrednost=7;                 Broj8->levo=Broj7;         Broj8->desno=NULL;         Broj8->iznad=Broj5;         Broj8->ispod=NULL;         }         inline void doExpansion()     {         Formacija *temp;         temp= this;         temp->getHeuristic();         if(temp->MogucPotezGore())         {             temp->GORE=temp->PomeriGore();             temp->GORE->Parent=temp;             temp->GORE->getHeuristic();             temp->GORE->ZadnjiPotez=1;             temp->GORE->C=::brojac;             brojac++;             Linked->add(temp->GORE->C,temp->GORE);         }                 if(temp->MogucPotezDole())         {                 temp->DOLE=temp->PomeriDole();             temp->DOLE->Parent=temp;             temp->DOLE->getHeuristic();             temp->DOLE->ZadnjiPotez=2;             temp->DOLE->C=::brojac;             brojac++;             Linked->add(temp->DOLE->C,temp->DOLE);         }                         if(temp->MogucPotezLevo())         {             temp->levo=temp->PomeriLevo();             temp->levo->Parent=temp;             temp->levo->getHeuristic();             temp->levo->ZadnjiPotez=4;             temp->levo->C=::brojac;             brojac++;             Linked->add(temp->levo->C,temp->levo);         }         if(temp->MogucPotezDesno())         {                 temp->desno=temp->PomeriDesno();             temp->desno->Parent=temp;             temp->desno->getHeuristic();             temp->desno->ZadnjiPotez=3;             temp->desno->C=::brojac;             brojac++;             Linked->add(temp->desno->C,temp->desno);                     }         Linked->del(temp->C);            }     void Init(int *a)     {         SlobodanBlok->levo=NULL;         SlobodanBlok->desno=Broj1;         SlobodanBlok->iznad=NULL;         SlobodanBlok->ispod=Broj3;         SlobodanBlok->pozicija=0;         SlobodanBlok->vrednost=a[0];                 Broj1->levo=SlobodanBlok;         Broj1->desno=Broj2;         Broj1->iznad=NULL;         Broj1->ispod=Broj4;         Broj1->pozicija=1;         Broj1->vrednost=a[1];                 Broj2->levo=Broj1;         Broj2->desno=NULL;         Broj2->iznad=NULL;         Broj2->ispod=Broj5;         Broj2->pozicija=2;         Broj2->vrednost=a[2];                 Broj3->levo=NULL;         Broj3->desno=Broj4;         Broj3->iznad=SlobodanBlok;         Broj3->ispod=Broj6;         Broj3->pozicija=3;         Broj3->vrednost=a[3];                 Broj4->levo=Broj3;         Broj4->desno=Broj5;         Broj4->iznad=Broj1;         Broj4->ispod=Broj7;         Broj4->pozicija=4;         Broj4->vrednost=a[4];                 Broj5->levo=Broj4;         Broj5->desno=NULL;         Broj5->iznad=Broj2;         Broj5->ispod=Broj8;         Broj5->pozicija=5;         Broj5->vrednost=a[5];                 Broj6->levo=NULL;         Broj6->desno=Broj7;         Broj6->iznad=Broj3;         Broj6->ispod=NULL;         Broj6->pozicija=6;         Broj6->vrednost=a[6];                 Broj7->levo=Broj6;         Broj7->desno=Broj8;         Broj7->iznad=Broj4;         Broj7->ispod=NULL;         Broj7->pozicija=7;         Broj7->vrednost=a[7];                 Broj8->levo=Broj7;         Broj8->desno=NULL;         Broj8->iznad=Broj5;         Broj8->ispod=NULL;         Broj8->pozicija=8;         Broj8->vrednost=a[8];                 }     bool goalState()     {         Formacija *temp = this;                     if(heuristic==0)             return true;         else             return false;         return false;     }     inline void getHeuristic()     {         Formacija *temp=this;                 int h=0;                 switch(temp->nadjiPrvo()->pozicija)         {         case 0:         case 2:         case 4: h+=1; break;         case 3:         case 5:         case 7: h+=2; break;         case 6:         case 8: h+=3; break;         default:break;         }         switch(temp->nadjiDrugo()->pozicija)         {         case 1:         case 5: h+=1; break;         case 0:         case 4:         case 8: h+=2; break;         case 3:         case 7: h+=3; break;         case 6: h+=4; break;         default:break;         }         switch(temp->nadjiTrece()->pozicija)         {         case 0:         case 4:         case 6: h+=1; break;         case 1:         case 7:         case 5: h+=2; break;         case 2:         case 8: h+=3; break;         default:break;         }         switch(temp->nadjiCetvrto()->pozicija)         {         case 1:         case 3:         case 5:         case 7: h+=1; break;         case 2:         case 0:         case 6:         case 8: h+=2; break;         default:break;         }         switch(temp->nadjiPeto()->pozicija)         {         case 2:         case 4:         case 8: h+=1; break;         case 7:         case 1:         case 3: h+=2; break;         case 6:         case 0: h+=3; break;         default:break;         }         switch(temp->nadjiSesto()->pozicija)         {         case 7:         case 3: h+=1; break;         case 0:         case 4:         case 8:h+=2; break;         case 5:         case 1: h+=3; break;         case 2: h+=4; break;         default:break;         }                 switch(temp->nadjiSedmo()->pozicija)         {         case 4:         case 6:         case 8: h+=1; break;         case 1:         case 3:         case 5: h+=2; break;         case 0:         case 2: h+=3; break;         default:break;         }         switch(temp->nadjiOsmo()->pozicija)         {         case 5:         case 7: h+=1; break;         case 2:         case 4:         case 6: h+=2; break;         case 1:         case 3: h+=3; break;         case 0: h+=4; break;         default:break;         }         heuristic =  h;         if(temp->Parent!=NULL)         {             NOM=temp->Parent->NOM+1;             Function = heuristic + NOM;         }             }         bool Provera(int *h, int *t)     {         for(int i=0;i<9;i++)             if(t[i]!=h[i])             {                 delete []h;                 delete []t;                 return false;             }             delete []h;             delete []t;         return true;     }         Formacija* getMinHeuristic()     {         Formacija *temp=Linked->Searchcc();         return temp;     }     PoljeSlagalice* Search(int val)     {                 if(SlobodanBlok->vrednost==val)             return SlobodanBlok;         else if (Broj1->vrednost==val)             return Broj1;         else if(Broj2->vrednost==val)                 return Broj2;         else if(Broj3->vrednost==val)             return Broj3;         else if(Broj4->vrednost==val)             return Broj4;         else if(Broj5->vrednost==val)             return Broj5;         else if(Broj6->vrednost==val)             return Broj6;         else if(Broj7->vrednost==val)             return Broj7;         else if(Broj8->vrednost==val)             return Broj8;             return NULL;     }     PoljeSlagalice* getSlobodanBlok()     {         return Search(0);     }     PoljeSlagalice* nadjiPrvo()     {         return Search(1);        }     PoljeSlagalice* nadjiDrugo()     {         return Search(2);     }     PoljeSlagalice* nadjiTrece()     {         return Search(3);     }     PoljeSlagalice* nadjiCetvrto()     {         return Search(4);     }     PoljeSlagalice* nadjiPeto()     {         return Search(5);     }     PoljeSlagalice* nadjiSesto()     {         return Search(6);     }     PoljeSlagalice* nadjiSedmo()     {         return Search(7);     }     PoljeSlagalice* nadjiOsmo()     {         return Search(8);     }     Formacija* PomeriGore(int flag=0)     {         Formacija *temp=this;                 testGORE=new Formacija(1);         testGORE->SlobodanBlok->copy(temp->SlobodanBlok);         testGORE->Broj1->copy(temp->Broj1);         testGORE->Broj2->copy(temp->Broj2);         testGORE->Broj3->copy(temp->Broj3);         testGORE->Broj4->copy(temp->Broj4);         testGORE->Broj5->copy(temp->Broj5);         testGORE->Broj6->copy(temp->Broj6);         testGORE->Broj7->copy(temp->Broj7);         testGORE->Broj8->copy(temp->Broj8);                 int h= testGORE->getSlobodanBlok()->iznad->vrednost;         PoljeSlagalice *temp2=testGORE->getSlobodanBlok();         temp2->iznad->vrednost=0;         temp2->vrednost=h;     return testGORE;         }     Formacija* PomeriDole(int flag=0)     {             Formacija *temp=this;         testDOLE=new Formacija(1);                     testDOLE->SlobodanBlok->copy(temp->SlobodanBlok);         testDOLE->Broj1->copy(temp->Broj1);         testDOLE->Broj2->copy(temp->Broj2);         testDOLE->Broj3->copy(temp->Broj3);         testDOLE->Broj4->copy(temp->Broj4);         testDOLE->Broj5->copy(temp->Broj5);         testDOLE->Broj6->copy(temp->Broj6);         testDOLE->Broj7->copy(temp->Broj7);         testDOLE->Broj8->copy(temp->Broj8);                 int h= testDOLE->getSlobodanBlok()->ispod->vrednost;                 PoljeSlagalice *temp2=testDOLE->getSlobodanBlok();         temp2->ispod->vrednost=0;         temp2->vrednost=h;             return testDOLE;             }     Formacija* PomeriLevo(int flag =0)     {                         Formacija *temp=this;             testlevo=new Formacija(1);             testlevo->SlobodanBlok->copy(temp->SlobodanBlok);         testlevo->Broj1->copy(temp->Broj1);         testlevo->Broj2->copy(temp->Broj2);         testlevo->Broj3->copy(temp->Broj3);         testlevo->Broj4->copy(temp->Broj4);         testlevo->Broj5->copy(temp->Broj5);         testlevo->Broj6->copy(temp->Broj6);         testlevo->Broj7->copy(temp->Broj7);         testlevo->Broj8->copy(temp->Broj8);                 int h= testlevo->getSlobodanBlok()->levo->vrednost;         PoljeSlagalice *temp2=testlevo->getSlobodanBlok();                         temp2->levo->vrednost=0;         temp2->vrednost=h;                     return testlevo;         }         Formacija* PomeriDesno(int flag =0)     {         if (flag ==0)         {         Formacija *temp=this;         testdesno=new Formacija(1);         testdesno->SlobodanBlok->copy(temp->SlobodanBlok);         testdesno->Broj1->copy(temp->Broj1);         testdesno->Broj2->copy(temp->Broj2);         testdesno->Broj3->copy(temp->Broj3);         testdesno->Broj4->copy(temp->Broj4);         testdesno->Broj5->copy(temp->Broj5);         testdesno->Broj6->copy(temp->Broj6);         testdesno->Broj7->copy(temp->Broj7);         testdesno->Broj8->copy(temp->Broj8);         int h= testdesno->getSlobodanBlok()->desno->vrednost;                 PoljeSlagalice *temp2=testdesno->getSlobodanBlok();                     temp2->desno->vrednost=0;         temp2->vrednost=h;                         return testdesno;         }         else         {             Formacija *temp=this;         int h= temp->getSlobodanBlok()->desno->vrednost;                 PoljeSlagalice *temp2=temp->getSlobodanBlok();                     temp2->desno->vrednost=0;         temp2->vrednost=h;         return temp;         }     } bool MogucPotezGore()     {         if(getSlobodanBlok()->iznad == NULL)             return false;         else         {             if(NRGORE())                 return true;             else                 return false;         }     }     bool MogucPotezDole()     {             if(getSlobodanBlok()->ispod == NULL)             return false;         else         {             if(NRDOLE())                 return true;             else                 return false;         }     }     bool MogucPotezDesno()     {         if(getSlobodanBlok()->desno == NULL)             return false;         else         {             if(NRdesno())                 return true;             else                 return false;         }     }     bool MogucPotezLevo()     {             if(getSlobodanBlok()->levo == NULL)             return false;         else         {             if(NRlevo())                 return true;             else                 return false;         }     }     bool NRdesno()     {         Formacija *hello=this;         hello = hello->PomeriDesno();         for (int i=0;i<brojac2;i++)             if(Provera(X[i].ptr->getPlace(),hello->getPlace()))                 return false;         return true;     }     bool NRlevo()     {         Formacija *hello=this;         hello = hello->PomeriLevo();         for (int i=0;i<brojac2;i++)             if(Provera(X[i].ptr->getPlace(),hello->getPlace()))                 return false;         return true;     }     bool NRGORE()     {         Formacija *hello=this;         hello = hello->PomeriGore();         for (int i=0;i<brojac2;i++)             if(Provera(X[i].ptr->getPlace(),hello->getPlace()))                 return false;         return true;     }     bool NRDOLE()     {         Formacija *hello=this;         hello = hello->PomeriDole();         for (int i=0;i<brojac2;i++)             if(Provera(X[i].ptr->getPlace(),hello->getPlace()))                 return false;             return true;     }     int *print_Init()     {         int *j=new int[9];         int k;         cout<<"Ovaj program sluzi za resavajne slagalice 3x3.\nUz pomoc AI pristupa problemu.\n";         cout<<"Koriscen je tzv. prvi najbolji algoritam.\nUkljucena je "<<" \"prevencija ponavljanja stanja\""<<" da bi program radio brze.\nA samim tim program daje i najoptimalnije resenje!\n\n";         cout<<"Programmed in C++\n\n";                         cout<<"Rasporedite elemente slagalice!\n";         cout<<"Na primer, ako unesete vrednosti:\n\n1\n2\n5\n\n3\n4\n8\n\n6\n7\n0\n";         cout<<"\nonda cete imati ovaj raspored za slagalicu:";         cout<<"\n\n1  2  5\n3  4  8\n6  7  0\n";         cout<<"\nNAPOMENA!\n Broj '0' je zamena za prazno polje.\n\n";         cout<<"Pritisnite bilo koji taster da bi napravili pocetnu slagalicu...";         cout<<endl;         getch();         system("cls");         cout<<"Pocnite sa unosom...\n\n";                     for(int i(0);i<9;i++)         {             k=i;                     cout<<i+1<<"-";             cin>>j[i];             for(int l=0;l<i;l++)                 if(j[l]==j[i])                 {    cout<<"Nije prihvacen broj, mozda ste ga vec uneli. Unesite opet... \n";                     i--;                     break;                 }             while(j[i]<0||j[i]>8)             {                 cout<<"Nije prihvacen broj! Morate uneti broj koji je veci ili jednak 0 i manji od 10 \n";                 cout<<i+1<<"-";                 cin>>j[i];             }             if(--k%3==1)                 cout<<endl;         }         system("cls");         cout<<"Program se izvrsava...\n\nMolim sacekajte!\n";         cout<<endl;                return j;         }     int *getPlace()     {         Formacija *temp = this;         int static *a;         a=new int[9];         a[0]=temp->SlobodanBlok->vrednost;         a[1]=temp->Broj1->vrednost;         a[2]=temp->Broj2->vrednost;         a[3]=temp->Broj3->vrednost;         a[4]=temp->Broj4->vrednost;         a[5]=temp->Broj5->vrednost;         a[6]=temp->Broj6->vrednost;         a[7]=temp->Broj7->vrednost;         a[8]=temp->Broj8->vrednost;         return a;     } }; Formacija *LinkedList::Searchcc() {     Leaves *temp=head;     Formacija *best;     int x=head->next->ptr->Function;     best=head->ptr;     while(temp!=NULL)     {         if(temp->ptr->Function<x)         {             x=temp->ptr->Function;             best=temp->ptr;         }         temp=temp->next;     }     X[brojac2].ptr=best;     brojac2++;     return best; } class GoalSearch {     Formacija *obj;     int *a ;     int i;     char choice;     public:     int BrojPotezaResavanja;             GoalSearch()     {         choice ='y';                                     while(choice=='y')         {             obj = new Formacija();             BrojPotezaResavanja=0;             obj->Init(obj->print_Init());             obj->getHeuristic();             a = obj->getPlace();             pocni_pretragu(obj);             trazi_opet();            }             }     void pocni_pretragu(Formacija *temp)     {         if(temp==NULL)             return;     if(temp->goalState())     {         printF(temp);         cout<<endl;         getch();         return;     }             else         {             temp->doExpansion();                            temp=temp->getMinHeuristic();             pocni_pretragu(temp);         }        }         void printF(Formacija *t)     {         BrojPotezaResavanja=0;         cout<<"RESENJE JE PRONADJENO: \n\n";                 recPrint(t);                         cout<<endl<<"Broj poteza za resavanje slagalice je:"<<BrojPotezaResavanja-2<<endl<<endl;     }     void recPrint(Formacija *k)     {         ++BrojPotezaResavanja;         if(k==NULL)             return;             else         {             recPrint(k->Parent);             switch(k->ZadnjiPotez)             {                 case 1: cout<<"\n\n"<<"Prazno polje ('0') treba premestiti => GORE\n"; break;                 case 2: cout<<"\n\n"<<"Prazno polje ('0') treba premestiti => DOLE\n"; break;                 case 3: cout<<"\n\n"<<"Prazno polje ('0') treba premestiti => DESNO\n"; break;                 case 4: cout<<"\n\n"<<"Prazno polje ('0') treba premestiti => LEVO\n"; break;                                 default: cout<<"Pocetno stanje:\n"; break;             }             a=k->getPlace();             for(int j=1;j<10;j+=1)             {                 cout<<a[j-1]<<"  ";                 if(j%3==0)                 cout<<endl;             }             delete []a;         }     }     void trazi_opet()     {         cout<<"\nNova slagalica?(y/n)  ";         cin>>choice;         switch(choice)         {             case 'y':             case 'Y': system("cls"); choice = 'y'; break;             case 'n':             case 'N': choice = 'n'; break;             default: cout<<"\nAko zelite da probate opet izaberite (y) na vasoj tastaturi, ako ne zelite onda (n) za izlaz\n"; trazi_opet(); break;         }         for (int i=0;i<8000;i++)             X[i].ptr=NULL;         brojac2=0;         delete Linked;             }     }; void main() {     GoalSearch obj; }


Pokusao sam da promenim onaj deo za formaciju, ali nista, nisam uspeo da promenim "finalno" stanje slagalice koje treba program da slaze

Moze li neko pomoci?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 968 korisnika na forumu :: 21 registrovanih, 5 sakrivenih i 942 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 357magnum, Ben Roj, bojan_t, Boris90, Bubimir, FOX, Georgius, gomago, Goran 0000, goxin, Istman, ivan1973, jackreacher011011, kybonacci, ladro, nuke92, opt1, Snorks, Toper, vathra, Vlad000