2014-11-12 2 views
1

У меня есть эта программа Tower of Hanoi в java, и я могу заставить ее работать, но я не могу за всю жизнь понять, как заставить ее показать, как это происходит , например, "диск 1 из TowerA в TowerC", "Disk 2 От TowerA до TowerB", и т.д ..Башня Ханоя - Java

Вот мой код:

есть ли способ, чтобы добавить «Disk # Из (TowerA , TowerB или TowerC) до (TowerA, TowerB или TowerC) "? Любая помощь приветствуется.

+3

Почему вы вывесили картину первого бита кода и вывода? Если кто-то хочет скопировать код, чтобы попытаться помочь, они не могут. – weston

+0

'Я могу заставить его работать', поэтому ваш компилятор не упоминает блокировку' else' и 'else if'? ** Редактирование **: о, это всего лишь плохая структура кода ... нормально, неважно. – Tom

+0

Я не думал; работал над этим совсем немного. Я извиняюсь. – fdsa

ответ

1

попробовать этот

public class TowerApp 
{ 
    static int nDisks = 3; 
    static public LinkStack A = new LinkStack("A"); 
    static public LinkStack B = new LinkStack("B"); 
    static public LinkStack C = new LinkStack("C"); 


    static public void doTowers(int nDisks, LinkStack source, LinkStack temp, LinkStack dest) 
    { 
     if(nDisks <= 4) 
      if ((nDisks % 2) == 0) 
      { 
       displayStacks(source, temp, dest); 
       nDisks = nDisks - 1; 
       long dn = source.pop(); 
       temp.push(dn); 
       System.out.println("Disk # "+dn+" moved from Tower "+source.getName() +" to Tower "+temp.getName()); 
       displayStacks(dest, source, temp); 

       dn = source.pop(); 
       dest.push(dn); 
       System.out.println("Disk # "+dn+" moved from Tower "+source.getName() +" to Tower "+dest.getName()); 

       doTowers(nDisks, temp, source, dest); 
      } 
      else 
      { 
       displayStacks(source, dest, temp); 
       nDisks = nDisks - 1; 
       long dn = source.pop(); 
       dest.push(dn); 
       System.out.println("Disk # "+dn+" moved from Tower "+source.getName() +" to Tower "+dest.getName()); 
       displayStacks(temp, source, dest); 
      } 

     /*   else if (nDisks >= 5) 
     { 
      doTowers(nDisks - 2, source, temp, dest); 
      temp.push(source.pop()); 
      doTowers(nDisks - 2, dest, source, temp); 
      dest.push(source.pop()); 
      doTowers(nDisks - 1, temp, source, dest); 
     }*/ 
    } 
    static public void displayStacks(LinkStack source, LinkStack temp, LinkStack dest) 
    {   
     long n = source.pop(); 
     temp.push(n); 
     System.out.println("Disk #"+n+" moved from Tower "+source.getName() +" to Tower "+temp.getName()); 
     PrintStacks(); 
     n = source.pop(); 
     dest.push(n); 
     System.out.println("Disk #"+n+" moved from Tower "+source.getName() +" to Tower "+dest.getName()); 
     PrintStacks(); 
     n= temp.pop(); 
     dest.push(n); 
     System.out.println("Disk #"+n+" moved from Tower "+temp.getName() +" to Tower "+dest.getName()); 
     PrintStacks(); 
    } 

    static public void PrintStacks() 
    { 
     A.displayStack("TowerA"); 
     B.displayStack("TowerB"); 
     C.displayStack("TowerC"); 
     System.out.println(""); 
    } 

    public static void main(String[] args) 
    { 
     for (int i = nDisks; i >= 1; i--) 
     { 
      A.push(i); 
     } 
     PrintStacks(); 

     doTowers(nDisks, A, B, C); 
    } 
} 

и LinkStack класса выглядеть

class LinkStack 
{ 

    private LinkedList theList; 
    private String name; 

    public LinkStack(String name)    // constructor 
    { 
     theList = new LinkedList(); 
     this.name = name; 
    } 
    public void push(long j)  // put item on top of stack 
    { 
     theList.addFirst(j); 
    } 
    public long pop()   // take item from top of stack 
    { 
     return (Long)theList.removeFirst(); 
    } 
    public boolean isEmpty()  // true if stack is empty 
    { 
     return (theList.isEmpty()); 
    } 
    public void displayStack(String name) 
    { 
     System.out.print(name + ": (top-->bottom): "); 
     System.out.println(theList); 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

выход:

TowerA: (top-->bottom): [1, 2, 3] 
TowerB: (top-->bottom): [] 
TowerC: (top-->bottom): [] 

Disk #1 moved from Tower A to Tower C 
TowerA: (top-->bottom): [2, 3] 
TowerB: (top-->bottom): [] 
TowerC: (top-->bottom): [1] 
0

Чтобы получить имя стеки, добавьте метод получения к вашему LinkStack классу:

public String getName() { 
    return this.name; 
} 

Чтобы создать желаемый результат, вызовите System.out.println(...) в методе под названием doTowers(). Чтобы получить имя вашего текущего стека, вы можете позвонить source.getName(), temp.getName() и dest.getName().

Кроме того, это может быть полезно добавить метод peek() к вашему LinkStack класса, который возвращает первый элемент внутреннего списка, в без удаления. Кроме того, вы можете сохранить возвращаемое значение source.pop() в локальной переменной, чтобы вы могли вывести его и передать его на dest.push().