###前提・実現したいこと
ハノイの塔を
スタックを使って書くにはどうすればいいか
Deque<Integer> xstack = new ArrayDeque<Integer>();
Deque<Integer> ystack = new ArrayDeque<Integer>();
円盤の数字を格納するスタックも必要ですね
Deque<Integer> stack = new ArrayDeque<Integer>();
3ステップ
●開始軸から中間軸へno-1枚移動する
●円盤noを開始軸から目的軸へ移動
●中間軸から目的軸へno-1枚移動する
no = 3のとき
move(3, 1, 3)
これが
●move(2, 1, 2):2枚の円盤を1軸から2軸へ移動する
(1, 1, 3)円盤1を1軸から3軸へ移動
(2, 1, 2)円盤2を1軸から2軸へ移動
(1, 3, 2)円盤1を3軸から2軸へ移動
●(3, 1, 3)円盤3を1軸から3軸へ移動
●move(2, 2, 3):2枚の円盤を2軸から3軸へ移動
(1, 2, 1)円盤1を2軸から1軸へ移動
(2, 2, 3)円盤2を2軸から3軸へ移動
(1, 1, 3)円盤1を1軸から3軸へ移動
これで完了
この順で
取り出し出されるスタックを書きたい
これをpushとpopを使って書きたい
java.util.ArrayDequeでpopとpushを使ってスタックとして書くとどうなるのでしょうか
Deque<Integer>
while(!stack.isEmpty())文を使いたいです。
Deque<Integer> stack = new ArrayDeque<Integer>();
Deque<Integer> xStack = new ArrayDeque<Integer>();
Deque<Integer> yStack = new ArrayDeque<Integer>();
move(3, 1, 3)
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
java
1 2import java.util.Scanner; 3import java.util.Deque; 4import java.util.ArrayDeque; 5class HanoiN { 6 static void move(int no, int x, int y) { 7 Deque<Integer> xStack = new ArrayDeque<Integer>(); 8 Deque<Integer> yStack = new ArrayDeque<Integer>(); 9 Deque<Integer> stack = new ArrayDeque<Integer>(); 10 11 stack.push(no); 12 xStack.push(x); 13 yStack.push(y); 14 while(!stack.isEmpty()){ 15 if(no > 1){ 16 stack.push(--no); 17 xStack.push(x); 18 yStack.push(6-x-y); 19 continue; 20 } 21 while(!stack.isEmpty()){ 22 no = stack.pop(); 23 x = xStack.pop(); 24 y = xStack.pop(); 25 System.out.println("円盤[" + no + "]を" + x + "軸から" + y + "軸へ移動"); 26 do{ 27 if(no > 1){ 28 stack.push(--no); 29 xStack.push(6-x-y); 30 yStack.push(y); 31 x = 6-x-y; 32 continue; 33 } 34 }while(stack.peek()!= 1); 35 } 36 } 37 } 38 } 39 40 public static void main(String[] args) { 41 Scanner stdIn = new Scanner(System.in); 42 43 System.out.println("ハノイの塔"); 44 System.out.print("円盤の枚数:"); 45 int n = stdIn.nextInt(); 46 47 move(n, 1, 3); 48 } 49} 50
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
Deque<Integer>
https://teratail.com/questions/107057
move(3, 1, 3);
開始
(3, 1, 3)プッシュ
(2, 1, 2)プッシュ
(1, 1, 3)プッシュ
スタック 入り口 (1, 1, 3)(2, 1, 2)(3, 1, 3) 底
(1, 1, 3)ポップ
(2, 1, 2)ポップ
(1, 3, 2)プッシュ
(1, 3, 2)ポップ
(3, 1, 3)ポップ
(2, 2, 3)プッシュ
(1, 2, 1)プッシュ
(1, 2, 1)ポップ
(2, 2, 3)ポップ
(1, 1, 3)プッシュ
(1, 1, 3)ポップ
終了
このロジックを実現させたいです
円盤1がプッシュされた(ピークが円盤1)ならポップにする
回答1件
あなたの回答
tips
プレビュー