これは宿題ではありません。学校にお金がないので、高速道路の料金所で交代制勤務をしている間(顧客が少ない長い夜)、自分で教えています。
JavaでHanoiTowersソルバーの単純なバージョンを実装しようとしています。私は自分自身を考える機会を得るために外部ソースに相談することなく、スタックと再帰関数を使用しています。
配列の配列(int[][] pegs
)から始めましたが、「移動」ステップの実装、特に開始位置の配列から「選択」する必要がある「高さ」と「高さ」を知る方法に行き詰まりました。ディスクをdestination-position配列にドロップします。もちろん、Stack<Integer>
これを行うのはデータ構造であり、何も追跡する必要はありません。私はこのバージョンをコーディングしましたが、あきらめることについて否定的に怠惰に感じました。私は自分の脳を伸ばし、アレイを使ってそれをすべて行う方法を理解することに興味を持っています。
を使用してこのコードを実装することは可能int[][] pegs
ですか?どのように?(ヒントで十分です。私はアプローチに固執しています。正しい道を特定した後、自分でレッグワークを行うことができます)。
ところで、私が書いたコードは「無難な」Javaですか、それとも誤用していますか?(JavaとC ++のどちらに焦点を合わせるかはまだわかりません。両方の電子書籍を持っています)。
package exercises;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class HanoiTowers {
private static final int N_DISCS = 6;
private static final int N_PEGS = 3;
private static int nMoves = 0;
private static final int POSITION_END_PEG = N_PEGS - 1;
private static final int POSITION_START_PEG = 0;
public static void main(String[] args) {
List<Stack<Integer>> pegs = new ArrayList<Stack<Integer>>(N_PEGS);
for (int i = 0; i < N_PEGS; i++) {
pegs.add(new Stack<Integer>());
}
for (int i = 0; i < N_DISCS; i++) {
pegs.get(POSITION_START_PEG).push(N_DISCS - i);
}
printPegs(pegs);
moveTowers(pegs, POSITION_START_PEG, POSITION_END_PEG, N_DISCS);
System.out.println(String.format("# moves: %d", nMoves));
}
private static void moveTowers(List<Stack<Integer>> pegs, int fromPeg,
int toPeg, int ofHeight) {
if (ofHeight <= 0) {
return;
}
int throughPeg = N_PEGS - fromPeg - toPeg; // Kind of a hack?
moveTowers(pegs, fromPeg, throughPeg, ofHeight - 1);
pegs.get(toPeg).push(pegs.get(fromPeg).pop());
nMoves++;
printPegs(pegs);
moveTowers(pegs, throughPeg, toPeg, ofHeight - 1);
}
private static void printPegs(List<Stack<Integer>> stacks) {
for (int j = N_DISCS - 1; j >= 0; j--) {
for (int i = 0; i < N_PEGS; i++) {
Stack<Integer> stack = stacks.get(i);
int disc = stack.size() < j + 1 ? 0 : stack.get(j);
System.out.print(String.format("[%d]", disc));
}
System.out.println();
}
System.out.println();
}
}