Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - risoluzione labirinto
Forum - Pascal - risoluzione labirinto

Avatar
luca95 (Normal User)
Rookie


Messaggi: 47
Iscritto: 20/02/2011

Segnala al moderatore
Postato alle 13:54
Giovedì, 08/09/2011
ciao a tutti ho trovato un gioco che si chiama labirinto mutevole praticamente hai 16 lettere che devi far andare nel loro spazio però ci sono dei bivi e devi andare dalla parte indicata dalla freccia e ad ogni passaggio la freccia cambia direzione e alla fine si formerà la parola es:
1                                            o
                                        /          \
2-3                                  O           O
                                     /   \        /   \
4-5-6-7                        o      o    o     o
                                  /\      /\   /\      /\
8-9-10-11-12             o o    o o o o   o o  13-14-15
                                /\ /\   /\ /\/\ /\  /\ /\
i cerchi indicano che li ci va la direzione della freccia destra o sinistra i numeri indicano che numero è il tondino per esempio quello su in alto è il primo quindi è la posizione numero uno quelli sotto a sinistra c'è la posizione due e a destra la tre e così fino alla quindici e in fondo dove non ci sono i cerchietti li arriveranno le lettere che formeranno poi la parola io ho provato a fare un programma che risolvesse in automatico questo gioco però dopo aver inserito le 16 lettere da dover spostare mi da un errore e mi dice exited with exit code 201 e non so come fare per farlo andare.
inserisco ora il mio programma se non capite qualcosa ditemelo che ve lo spiego :)

Codice sorgente - presumibilmente Delphi

  1. program frecce;
  2. uses crt;
  3. var dir: array [1..15] of byte; (*indica da che parte è girata la freccia, 0 sinistra 1 destra*)
  4. var let: array [1..16] of char; (*tiene le lettere da mettere in ordine*)
  5. var pos: array [1..15] of char; (*indica in che posizione si trova al momento la lettera*)
  6. var par: array [1..16] of char; (*tiene le lettere messe in ordine*)
  7. var i:byte;
  8.  
  9. procedure lettere;  (*inserimento lettere da ordinare*)
  10. Begin
  11.   for i:=1 to 16 do
  12.     Begin
  13.       write(i);
  14.       readln(let[i]);
  15.     End;
  16. End;
  17.  
  18. procedure dir_frecc;   (*sistemazione lettere*)
  19. Begin
  20.   dir[1]:=0;
  21.   dir[2]:=0;
  22.   dir[3]:=1;
  23.   dir[4]:=0;
  24.   dir[5]:=0;
  25.   dir[6]:=1;
  26.   dir[7]:=1;
  27.   dir[8]:=0;
  28.   dir[9]:=0;
  29.   dir[10]:=0;
  30.   dir[11]:=0;
  31.   dir[12]:=1;
  32.   dir[13]:=1;
  33.   dir[14]:=1;
  34.   dir[15]:=1;
  35.   for i:=0 to 16 do
  36.     Begin
  37.       pos[1]:=let[i];
  38.       if dir[1]=0 then
  39.         Begin
  40.           dir[1]:=1;
  41.           pos[2]:=pos[1];
  42.         End
  43.                   else
  44.         Begin
  45.           dir[1]:=0;
  46.           pos[3]:=pos[1];
  47.         End;
  48.         if pos[2]<>'' then
  49.           Begin
  50.             if dir[2]=0 then
  51.               Begin
  52.                 dir[2]:=1;
  53.                 pos[4]:=pos[2];
  54.               End
  55.                         else
  56.               Begin
  57.                 dir[2]:=0;
  58.                 pos[5]:=pos[2];
  59.               End;
  60.           End
  61.                      else
  62.           Begin
  63.             if dir[3]=0 then
  64.               Begin
  65.                 dir[3]:=1;
  66.                 pos[6]:=pos[3];
  67.               End
  68.                         else
  69.               Begin
  70.                 dir[3]:=0;
  71.                 pos[7]:=pos[3];
  72.                End;
  73.           End;
  74.           if pos[4]<>'' then
  75.             Begin
  76.               if dir[4]=0 then
  77.                 Begin
  78.                   dir[4]:=1;
  79.                   pos[8]:=pos[4];
  80.                 End
  81.                           else
  82.                 Begin
  83.                   dir[4]:=0;
  84.                   pos[9]:=pos[4];
  85.                 End;
  86.             End
  87.                        else
  88.           if pos[5]<>'' then
  89.             Begin
  90.               if dir[5]=0 then
  91.                 Begin
  92.                   dir[5]:=1;
  93.                   pos[10]:=pos[5];
  94.                 End
  95.                           else
  96.                 Begin
  97.                   dir[5]:=0;
  98.                   pos[11]:=pos[5];
  99.                 End;
  100.             End
  101.                         else
  102.           if pos[6]<>'' then
  103.             Begin
  104.               if dir[6]=0 then
  105.                 Begin
  106.                   dir[6]:=1;
  107.                   pos[12]:=pos[6];
  108.                 End
  109.                           else
  110.                 Begin
  111.                   dir[6]:=0;
  112.                   pos[13]:=pos[6];
  113.                 End;
  114.             End
  115.                         else
  116.           if pos[7]<>'' then
  117.             Begin
  118.               if dir[7]=0 then
  119.                 Begin
  120.                   dir[7]:=1;
  121.                   pos[14]:=pos[7];
  122.                 End
  123.                           else
  124.                 Begin
  125.                   dir[7]:=0;
  126.                   pos[15]:=pos[7];
  127.                 End;
  128.             End;
  129.          if pos[8]<>'' then
  130.             Begin
  131.               if dir[8]=0 then
  132.                 Begin
  133.                   dir[8]:=1;
  134.                   par[1]:=pos[8];
  135.                 End
  136.                           else
  137.                 Begin
  138.                   dir[8]:=0;
  139.                   par[2]:=pos[8];
  140.                 End;
  141.             End
  142.                        else
  143.          if pos[9]<>'' then
  144.             Begin
  145.               if dir[9]=0 then
  146.                 Begin
  147.                   dir[9]:=1;
  148.                   par[3]:=pos[9];
  149.                 End
  150.                           else
  151.                 Begin
  152.                   dir[9]:=0;
  153.                   par[4]:=pos[9];
  154.                 End;
  155.             End
  156.                        else
  157.          if pos[10]<>'' then
  158.             Begin
  159.               if dir[10]=0 then
  160.                 Begin
  161.                   dir[10]:=1;
  162.                   par[5]:=pos[10];
  163.                 End
  164.                           else
  165.                 Begin
  166.                   dir[10]:=0;
  167.                   par[6]:=pos[10];
  168.                 End;
  169.             End
  170.                         else
  171.         if pos[11]<>'' then
  172.             Begin
  173.               if dir[11]=0 then
  174.                 Begin
  175.                   dir[11]:=1;
  176.                   par[7]:=pos[11];
  177.                 End
  178.                           else
  179.                 Begin
  180.                   dir[11]:=0;
  181.                   par[8]:=pos[11];
  182.                 End;
  183.             End
  184.                         else
  185.         if pos[12]<>'' then
  186.             Begin
  187.               if dir[12]=0 then
  188.                 Begin
  189.                   dir[12]:=1;
  190.                   par[9]:=pos[12];
  191.                 End
  192.                           else
  193.                 Begin
  194.                   dir[12]:=0;
  195.                   par[10]:=pos[12];
  196.                 End;
  197.             End
  198.                         else
  199.         if pos[13]<>'' then
  200.             Begin
  201.               if dir[13]=0 then
  202.                 Begin
  203.                   dir[13]:=1;
  204.                   par[11]:=pos[13];
  205.                 End
  206.                           else
  207.                 Begin
  208.                   dir[13]:=0;
  209.                   par[12]:=pos[13];
  210.                 End;
  211.             End
  212.                         else
  213.         if pos[14]<>'' then
  214.             Begin
  215.               if dir[14]=0 then
  216.                 Begin
  217.                   dir[14]:=1;
  218.                   par[13]:=pos[14];
  219.                 End
  220.                           else
  221.                 Begin
  222.                   dir[14]:=0;
  223.                   par[14]:=pos[14];
  224.                 End;
  225.             End
  226.                         else
  227.         if pos[15]<>'' then
  228.             Begin
  229.               if dir[15]=0 then
  230.                 Begin
  231.                   dir[15]:=1;
  232.                   par[15]:=pos[15];
  233.                 End
  234.                           else
  235.                 Begin
  236.                   dir[15]:=0;
  237.                   par[16]:=pos[15];
  238.                 End;
  239.             End;
  240.     End;
  241. End;
  242.  
  243. procedure scrittura; (*scrittura parola*)
  244. Begin
  245.   for i:=1 to 15 do write(par[i]);
  246. End;
  247.  
  248. Begin
  249.   clrscr;
  250.   lettere;
  251.   dir_frecc;
  252.   scrittura;
  253.   readln;
  254. End.


grazie in anticipo per l'aiuto :)

Ultima modifica effettuata da luca95 il 08/09/2011 alle 14:04
PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 15:29
Giovedì, 08/09/2011
Ciao non capisco perché dir e pos li dichiari come array e poi hai il link dove hai trovato il gioco?

Poi dal disegno che hai fatto potresti usare un struttura chiamata albero

http://it.wikipedia.org/wiki/Albero_binario_di_ricerca

Ultima modifica effettuata da djleo il 08/09/2011 alle 15:31
PM Quote
Avatar
luca95 (Normal User)
Rookie


Messaggi: 47
Iscritto: 20/02/2011

Segnala al moderatore
Postato alle 15:57
Giovedì, 08/09/2011
se vuoi posso mettere un immagine perché è preso da una rivista :) e comunque non sapevo neanche esistesse la struttura ad albero e li ho dichiarati array perché devo aggiungerci anche la grafica prima volevo vedere se funzionava il programma

PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 16:03
Giovedì, 08/09/2011
ok posta l'immagine e vediamo un po cosa si può fare

PM Quote
Avatar
luca95 (Normal User)
Rookie


Messaggi: 47
Iscritto: 20/02/2011

Segnala al moderatore
Postato alle 22:29
Giovedì, 08/09/2011
ecco l'immagine del gioco


luca95 ha allegato un file: P1000848.JPG (159866 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 11:20
Venerdì, 09/09/2011
Ciao le frecce sono sempre cosi all'inizio o cambiano. Cioè nel ramo di destra sono sempre a destra in tutti i giochi o sono diverse le direzioni

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:36
Venerdì, 09/09/2011
Non vedo quale sia la sfida nel gioco, dato che è tutto determinato. Devi semplicemente seguire le frecce e invertire quelle toccate ad ogni passaggio, perciò la parola si forma sempre e comunque alla fine. Sarebbe stato leggermente più complesso se ti avessero chiesto di determinare l'ordine in cui devono cadere le lettere per formare una parola. Comunque...

Il tuo codice è spaventevole. Tutti quegli if sono inutili.
Come ha detto djleo, il tutto è risolvibile con un semplice albero binario. In ogni nodo poni il verso della freccia. Quindi esegui una visita breadth-first per arrivare all'ultimo livello dell'albero, ossia alle sue foglie, e le numeri in ordine crescente da destra a sinistra. Dopodiché esegui una visita depth-first in pre-order modificata in modo da scendere solo nel verso della freccia. Una volta arrivato a una foglia dell'albero, prendi il numero ad essa associato. Esso conterrà l'indice della lettera nella parola finale. Ripeti tutto tante volte quante sono le lettere.

PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 11:38
Venerdì, 09/09/2011
Allora se non è cosi. Cioè se le direzioni cambiano le mettiamo in un file di testo.
Esempio di file
s
sd
ssdd
ssssdddd

il file viene utilizzato solo la prima volta per caricare le direzioni nell'albero.
Un altra domanda la stringa finale ha un senso compiuto o no?

rettifico il file deve essere cosi:

s
s
s
s

s

s
s

s

d
d
d

d

d
d

d

Ultima modifica effettuata da djleo il 09/09/2011 alle 13:06
PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 13:21
Venerdì, 09/09/2011
Ho buttato giù un po di codice
Codice sorgente - presumibilmente Delphi

  1. Program labi;
  2. uses wincrt;
  3.  
  4. type albin=^nodo;
  5.      nodo=record
  6.              inf:char;
  7.              sx,dx:albin;
  8.           end;
  9.     vchar=array[1..40]of char;
  10. var albero:albin;
  11.     dir:char;
  12.     lung,i:integer;
  13.     d:vchar;
  14.  
  15. procedure CaricaDirezioni(var a:vchar; var l:integer);
  16. var fr:text;
  17.     c:char;
  18. begin
  19.   assign(fr,'dir.txt');
  20.   reset(fr);
  21.   l:=0;
  22.   while not EOF(fr) do
  23.   begin
  24.    read(fr,c);
  25.    l:=l+1;
  26.    a[l]:=c;
  27.   end;
  28. end;
  29. procedure figli(var a:albin);
  30. begin
  31. for i:=2 to lung do
  32. begin
  33.  if d[i]='' then
  34.              begin
  35.               new(a^.sx);
  36.               a^.sx^.inf:='';
  37.               a^.sx:=nil;
  38.              end
  39.             else
  40.              begin
  41.                new(a^.sx);
  42.                a^.sx^.inf:=d[i];
  43.                figli(a^.sx);
  44.              end;
  45. if d[i]='' then
  46.              begin
  47.               new(a^.dx);
  48.               a^.dx^.inf:='';
  49.               a^.dx:=nil;
  50.              end
  51.            else
  52.             begin
  53.              new(a^.dx);
  54.              a^.dx^.inf:=d[i];
  55.              figli(a^.dx);
  56.             end;
  57. end;
  58. end;
  59. procedure CreaAlbero(var a:albin);
  60. begin
  61.  if d[1]= '' then a:=nil
  62.              else
  63.               begin
  64.                new(a);
  65.                a^.inf:=d[1];
  66.                figli(a);
  67.               end;
  68. end;


riguardo solo il caricamento delle direzioni e dei nodi vuoti alla fine per posizionare le lettere, per ora basta questo.
Oggi faccio l'ultima procedura per caricare le lettere al posto giusto

PM Quote