Program na riesenie bludiska C++

Programovacie jazyky, rady, poradňa...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Program na riesenie bludiska C++

Príspevok od používateľa reDo »

robim program na riesenie bludiska ale mam tam bug kde to nehce najst akoby a nwm kde je chyba tak mi plsp omozte ju najst

txtcko obsahuje bludisko

tie divne znaky si nevsimajte to je v konzole v poriadku, S=start F=finish len mne by to malo prepisat to F a jakosi to nejde a nwm preco pls pomozte

Kód: Vybrať všetko

#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;

struct uzol
{
       int x;
       int y;
       char smer;       
} uzly[20]; 

int aktUzol=0;
char pole[20][10];

char dalsiKrok(int x, int y)
{
 
 if(pole[x][y-1]==' '||pole[x][y-1]=='F')
 return'U';
 
 else if(pole[x][y+1]==' '||pole[x][y+1]=='F')
 return'D';
 
 else if(pole[x+1][y]==' '||pole[x+1][y]=='F')
 return'R';
     
 else if(pole[x-1][y]==' '||pole[x][y-1]=='F')
 return'L';
     
 else
 return'N';       
}

void vratUzol(int & x, int & y)
{
  aktUzol--;
  
  x=uzly[aktUzol].x;
  y=uzly[aktUzol].y;
      
return; 
}

void akUzol(int x, int y)
{
 int i=0;
 char smer;
 
 if(pole[x][y-1]==' ')
 i++;
 
 if(pole[x][y+1]==' ')
 i++;
 
 if(pole[x+1][y]==' ')
 i++;
 
 if(pole[x-1][y]==' ')
 i++;
 
 if(i>=2)
 {
        uzly[aktUzol].x=x;
        uzly[aktUzol].y=y;
        
        if(pole[x][y-1]=='x')
        smer='U';
 
        if(pole[x][y+1]=='x')
        smer='D';
 
        if(pole[x+1][y]=='x')
        smer='R';
     
        if(pole[x-1][y]=='x')
        smer='L';
        
        uzly[aktUzol].smer=smer;
        aktUzol++;
        }     
return;
}

bool Nacitaj(void)
{
 char znak;
 
 ifstream file;
 file.open("maze.txt");
 
for(int y=0;y<11;y++)
{
        for(int x=0;x<21;x++) {
        znak=file.get();
        pole[x][y]=znak;                 
                         }
        }

file.close();
}

void Nakresli(void)
{

for(int y=0;y<11;y++)
{
        for(int x=0;x<20;x++)
        cout<<pole[x][y];
        cout<<endl;
        }

}

int main(void)
{
system("color e");

Nacitaj();
Nakresli();
int i=0;
int x=1, y=1;

bool game=true;

while(game!=false)
{
 akUzol(x,y);
 pole[x][y]='x';
 
 switch(dalsiKrok(x,y))
 {
                       case 'U': 
                       y--;
                       break;
                            
                       case 'D': 
                       y++;
                       break;
                            
                       case 'R': 
                       x++;
                       break;
                            
                       case 'L': 
                       x--;
                       break;      
                       
                       case 'N': 
                       vratUzol(x,y);
                       break;
                       }
 if(pole[x][y]=='F')
 break;
 
 pole[x][y]='A';
 
 Nakresli();
 cout<<"X= "<<x<<"\n"<<"Y= "<<y<<endl;

Sleep(100);
}

for(i=0;i<=20;i++)
cout<<"Uzol c:"<<i<<"\nX:"<<uzly[i].x<<"\nY:"<<uzly[i].y<<endl;

cout<<"Ciel najdeny! :D\n";             
cin.get();
return 1;
}
Prílohy
maze.rar
cely subor exe+source+bludisko:
bludisko tie divne znaky si nevsimajte to je v konzole v poriadku, S=start F=finish
(251.12 KiB) 24 stiahnutí
bludisko
bludisko
z11111111111111111111111.png (9.31 KiB) 639 zobrazení
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Program na riesenie bludiska

Príspevok od používateľa audiotrack »

bludisko je tradičný príklad na backtracking. Ak potrebuješ minimálnu cestu, tak potom sa to rieši vlnením. Určite by som to ale nerobil cyklom ako sa pokúšaš ty, zbytočne si to komplikuješ
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: Program na riesenie bludiska C++

Príspevok od používateľa reDo »

nemas nejaky priklad co si urobil alebo daco take, inak nevies preco mi to nechce potvrdit a vyskocit z cyklu podla toho F v tom subore?, inde v subore to funguje bez problemov ale hentam nie

//autoeditácia príspevku (18 Jún 2010, 16:12)
a ako by som to mal robit cez backtracking? lebo ja sa tam vraciam po uzloch
TGiJack
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 30 nov 2006, 19:37
Bydlisko: NO
Kontaktovať používateľa:

Re: Program na riesenie bludiska C++

Príspevok od používateľa TGiJack »

a čo tak vyskušat niečo z grafov a použit tam "TARRYHO Algoritmus" :) elegantne riešenie
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: Program na riesenie bludiska C++

Príspevok od používateľa reDo »

uz som ten bug vyriesil, lepsie povedane nasiel som chybu,v akUzol mali byt podmienky ako v dalsiKrok s F a nielen s prazdnym miestom, nestudujem informatiku som len samouk a este mlady a nie som taky zbehnuty v algoritmoch takze som o takom este nevel diky za nove vedomosti :)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Program na riesenie bludiska C++

Príspevok od používateľa audiotrack »

tarryho algoritmus je práve spomínaný backtracking (keď sa obmedzíme na bludisko, lebo vo všeobecnosti to neplatí)
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: Program na riesenie bludiska C++

Príspevok od používateľa reDo »

aha dakujem
Napísať odpoveď