Hanojské věže - špatné zobrazování – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hanojské věže - špatné zobrazování – Java – Fórum – Programujte.comHanojské věže - špatné zobrazování – Java – Fórum – Programujte.com

 

Račanský Tomáš
~ Anonymní uživatel
3 příspěvky
22. 1. 2013   #1
-
0
-

Ahoj, jsem velký amatér v oblasti programování a do školy mám napsat program na hanojské věže.

To jak fungujou najdu všude, ale já potřebuju nějak vypisovat každý krok kde se jaký disk nachází a to sem nikde nenašel. Tady posílám kód, který sem horko těžko napsal, a mám tam problém s obrazováním nevim s rekurzí těch disků.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hanojskeuswa;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.Scanner;
import java.util.Stack;

/**
*
* @author Celnik
*/
public class Hanojskeuswa {
   
   

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        try {
                                                             // vytvoreni promenne pocetDisku
            BufferedReader fileOutReader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("zadejte vystupni soubor");                 
            String fileOut = fileOutReader.readLine();                          //nacte vystup
            Scanner sc = new Scanner(System.in);                                //deklarace Scanneru
            System.out.println("zadejte pocet disku");
            int pocetDisku = sc.nextInt();                                          //ze vstupu nacte cislo - pocetDisku a prepise
            FileOutputStream vystup = new FileOutputStream(fileOut);            //pracuje se souborem vystup.txt
            try (PrintStream ps = new PrintStream(vystup)) {
                Stack<Integer> A, B, C;
                A = new Stack();
                B = new Stack();
                C = new Stack();
           
           

                for (int i = pocetDisku; i > 0; i--) {                              //prida do stacku A pocet disku
                    A.push(i);
                }

                ps.println("Prvni jehla: " + A + " Druha jehla: " + B + " Treti jehla: " + C);

                prenesVez(pocetDisku, A, B, C, ps);
            }
            System.out.println("hotovo");
        } catch (IOException e) {                                               //ochrana
            System.out.println("Chyba");
        }
    }

    private static void prenesVez(int pocetDisku, Stack<Integer> odkud, Stack<Integer> kam, Stack<Integer> pomoc, PrintStream ps) {
        if (pocetDisku > 0) {                                                   // jestlize je pocetDisku > 0 provede cyklus
            prenesVez(pocetDisku - 1, odkud, pomoc, kam, ps);                  
            kam.push(odkud.pop());
           
            ps.println("Prvni jehla: " + odkud + " Druha jehla: " + pomoc + " Treti jehla: " + kam);
            prenesVez(pocetDisku - 1, pomoc, kam, odkud, ps);
        }
       
    }
   
}

Při spuštění se program zeptá jak se má jmenovat soubor do kterého se uloží umístění disků. (např. test.txt)

potom počet disků a když zadám třeba 3, tak se zobrazí toto:

Prvni jehla: [3, 2, 1] Druha jehla: [] Treti jehla: []
Prvni jehla: [3, 2] Druha jehla: [] Treti jehla: [1]
Prvni jehla: [3] Druha jehla: [1] Treti jehla: [2]
Prvni jehla: [] Druha jehla: [3] Treti jehla: [2, 1]
Prvni jehla: [] Druha jehla: [2, 1] Treti jehla: [3]
Prvni jehla: [2] Druha jehla: [3] Treti jehla: [1]
Prvni jehla: [] Druha jehla: [1] Treti jehla: [3, 2]
Prvni jehla: [] Druha jehla: [] Treti jehla: [3, 2, 1]

já potřebuju tohle:

Prvni jehla: [3, 2, 1] Druha jehla: [] Treti jehla: []
Prvni jehla: [3, 2] Druha jehla: [] Treti jehla: [1]
Prvni jehla: [3] Druha jehla: [2] Treti jehla: [1]
Prvni jehla: [3] Druha jehla: [2, 1] Treti jehla: []
Prvni jehla: [] Druha jehla: [2, 1] Treti jehla: [3]
Prvni jehla: [1] Druha jehla: [2] Treti jehla: [3]
Prvni jehla: [1] Druha jehla: [] Treti jehla: [3, 2]
Prvni jehla: [] Druha jehla: [] Treti jehla: [3, 2, 1]

Díky za každou pomoc.

Nahlásit jako SPAM
IP: 90.177.127.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 1. 2013   #2
-
0
-

#1 Račanský Tomáš
Máš tam jenom špatně výpis, místo

ps.println("Prvni jehla: " + odkud + " Druha jehla: " + pomoc + " Treti jehla: " + kam);

má být:

ps.println("Prvni jehla: " + odkud + " Druha jehla: " + kam + " Treti jehla: " + kam);

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 1. 2013   #3
-
0
-

#2 JoDiK
Beru zpět, přehlédl jsem, že máš jiný výpis než všichni ostatní...

V mém výpisu je jen odkud a kam...

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 1. 2013   #4
-
0
-

#3 JoDiK
Ale asi jo, měl bys tam snad mít:

ps.println("Prvni jehla: " + odkud + " Druha jehla: " + kam + " Treti jehla: " + pomoc);

protože třetí je ta pomocná...

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 1. 2013   #5
-
0
-

#4 JoDiK
Tak už jsem na to asi přišel, protože v jednom z těch rekurzivních volání se prohazují jehly, nemůžeš to vypisovat tak jak to vypisuješ...

Moje řešení vypadá takto (zásobníky mají vrchol vpravo a číslo určuje šířku disku)

  Tyc(1):[123]   Tyc(2):[]      Tyc(3):[]    
  Tyc(1):[23]    Tyc(2):[1]     Tyc(3):[]    
  Tyc(1):[3]     Tyc(2):[1]     Tyc(3):[2]   
  Tyc(1):[3]     Tyc(2):[]      Tyc(3):[12]  
  Tyc(1):[]      Tyc(2):[3]     Tyc(3):[12]  
  Tyc(1):[1]     Tyc(2):[3]     Tyc(3):[2]   
  Tyc(1):[1]     Tyc(2):[23]    Tyc(3):[]    
  Tyc(1):[]      Tyc(2):[123]   Tyc(3):[] 

:

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 1. 2013   #6
-
0
-

#5 JoDiK
Zásobníky (nebo-li tyče) mají samozřejmě vrchol vlevo...

Nahlásit jako SPAM
IP: 88.103.236.–
Račanský Tomáš
~ Anonymní uživatel
3 příspěvky
24. 1. 2013   #7
-
0
-

Můžeš mi poslat ten kód nebo jenom tu rekurzívu?  já to tam prostě nevidim

Nahlásit jako SPAM
IP: 90.177.127.–
JoDiK
~ Anonymní uživatel
987 příspěvků
24. 1. 2013   #8
-
0
-

#7 Račanský Tomáš
Ještě jsem si všiml, že máš jako pomocnou tyč/jehlu 2 a cílovou 3, pak to u mně vypadá takto:

  Tyc(1):[123]   Tyc(2):[]      Tyc(3):[]    
  Tyc(1):[23]    Tyc(2):[]      Tyc(3):[1]   
  Tyc(1):[3]     Tyc(2):[2]     Tyc(3):[1]   
  Tyc(1):[3]     Tyc(2):[12]    Tyc(3):[]    
  Tyc(1):[]      Tyc(2):[12]    Tyc(3):[3]   
  Tyc(1):[1]     Tyc(2):[2]     Tyc(3):[3]   
  Tyc(1):[1]     Tyc(2):[]      Tyc(3):[23]  
  Tyc(1):[]      Tyc(2):[]      Tyc(3):[123] 

Rekurzi máme asi všichni stejnou (ja dělám v Pascalu, ale to snad vidíš, že je to stejný):

procedure PrenesVez(vyska : integer; odkud,kam,pres : Ptyc);
begin
  if vyska>0 then
    begin
      PrenesVez(vyska-1,odkud,pres,kam);
      kam^.Push(odkud^.Pop);
      PrenesVez(vyska-1,pres,kam,odkud);
    end;
end;

A podle mně je ta "chyba" v tom, že vypisuješ seznamy disků podle aktuálních parametrů ale ty jsou jednou v pořadí odkud, pomoc, kam a podruhé zas pomoc, kam, odkud.

Takže v jednom výpisu je u tebe 1. jehla odkud, ale v dalším je 1.jehla pomoc!

Já to vypisuju externě, neboli mám očíslované zásobníky T1 T2 a T3 a ty pokaždé vypisuju ve stejným pořadí:

procedure PrenesVez(vyska : integer; odkud,kam,pres : Ptyc);
begin
  if vyska>0 then
    begin
      PrenesVez(vyska-1,odkud,pres,kam);
      kam^.Push(odkud^.Pop);
      t1^.Kresli;
      t2^.Kresli;
      t3^.Kresli;
      PrenesVez(vyska-1,pres,kam,odkud);
    end;
end;
Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
24. 1. 2013   #9
-
0
-

#8 JoDiK
Jestli se dobře koukám, tak ta moje verze odpovídá tomu, co máš požadováno.

Takže ty to máš snad taky dobře, jen to špatně vypisuješ...

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
24. 1. 2013   #10
-
0
-

#9 JoDiK
Mělo by to vyřešit tohle:

ps.println("Prvni jehla: " + A + " Druha jehla: " + B + " Treti jehla: " + C);

Zkus...

Nahlásit jako SPAM
IP: 88.103.236.–
Račanský Tomáš
~ Anonymní uživatel
3 příspěvky
25. 1. 2013   #11
-
0
-

Když to udělám tak mi to vypíše u všeho null, protože mám ty A B a C v jiný metodě

Nahlásit jako SPAM
IP: 88.102.144.–
JoDiK
~ Anonymní uživatel
987 příspěvků
25. 1. 2013   #12
-
0
-

#11 Račanský Tomáš
Já je mám jako globální...

Tak to musíš vyřešit nějak jinak...

Nahlásit jako SPAM
IP: 88.103.236.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 46 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý