Java 爪哇河内塔楼仅使用int[][](可以这样做吗?)

Java 爪哇河内塔楼仅使用int[][](可以这样做吗?),java,algorithm,recursion,towers-of-hanoi,Java,Algorithm,Recursion,Towers Of Hanoi,这不是家庭作业,我没有钱上学,所以我在高速公路上的收费站轮班工作时自学(长夜很少有顾客) 我正在尝试用Java实现一个简单版本的HanoiTowers解算器。我正在使用堆栈和递归函数,没有咨询外部资源,以便有机会自己思考 我从一个数组(int[][]pegs)开始,但在执行“移动”步骤时遇到了困难,特别是如何知道我需要从起始位置数组中“拾取”的“高度”以及我将在目标位置数组中放置光盘的“高度”。当然,使用Stack是数据结构为我做到了这一点,我不必跟踪任何东西。我编写了这个版本,但对放弃感到消极

这不是家庭作业,我没有钱上学,所以我在高速公路上的收费站轮班工作时自学(长夜很少有顾客)

我正在尝试用Java实现一个简单版本的HanoiTowers解算器。我正在使用堆栈和递归函数,没有咨询外部资源,以便有机会自己思考

我从一个数组(
int[][]pegs
)开始,但在执行“移动”步骤时遇到了困难,特别是如何知道我需要从起始位置数组中“拾取”的“高度”以及我将在目标位置数组中放置光盘的“高度”。当然,使用
Stack
是数据结构为我做到了这一点,我不必跟踪任何东西。我编写了这个版本,但对放弃感到消极懒惰;我对扩展我的大脑和理解如何用数组来完成这一切很感兴趣

是否可以使用
int[]pegs
实现此代码?怎么用?(一个提示就足够了,我只是停留在方法上,在确定正确的路径后,我可以自己做腿部工作)

顺便问一下,我写的代码是“尚可”的Java还是我误用了东西?(我仍然不确定是否关注java或C++。我有电子书,两者都有)。< /P>
成套练习;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Stack;
公营汉诺威酒店{
专用静态最终整数N_盘=6;
私有静态最终整数N_PEGS=3;
私有静态int nMoves=0;
专用静态最终整数位置\u END\u PEG=N\u PEGS-1;
私有静态最终整数位置\u开始\u PEG=0;
公共静态void main(字符串[]args){
列表标桩=新阵列列表(N_标桩);
对于(int i=0;i
我能想到的使用简单数组的最佳方法是将它们视为peg,给它们一个等于光盘数量的长度,然后在使用整数时,使每个位置的值等于光盘的大小,然后要移动它们,需要从顶部到底部扫描整个peg(什么是顶部和底部取决于您),当您找到第一个时,将其移动到下一个桩号,这还包括扫描接收桩号以寻找合适的位置

如果要避免扫描peg,可以使用其他变量,将最新的已知占用或空闲位置存储在相应的peg中


另外,最好的方法是使用列表而不是简单的数组,但这可能是另一个练习。

我通常的方法不会显式表示peg:我只使用一个类型为
int[]
的值。每个peg只是一个介于1和3之间的数字,每个磁盘都位于数组中的固定位置。例如:

    *****                                
  *********                       *      
 ***********       ***         *******  
将表示为
{1,1,3,1,2,3}
{3,2,1,3,1,1}
,具体取决于您是从最大到最小还是从最小到最大顺序排列桩号

这种表示法的优点是:它大大简化了寻找下一步的算法。缺点是:它与大多数人想象问题的方式不太接近

使用此表示查找下一个移动的伪代码,假设光盘从最大到最小列出:

nextMove (int[] world, int targetPeg) {
  move = no move
  for(int i = 0; i < world.length; i++) {
    if(world[i] != targetPeg) {
      move = from world[i] to targetPeg
      targetPeg = ∈ {1,2,3} ∖ {world[i],targetPeg}
    }
  }
  return move;
}
nextMove(int[]世界,int targetPeg){
移动=不移动
for(int i=0;i
使用数组绝对可以做到这一点。最终,所有这些抽象都归结为对数组的操作,因此您只是放弃了额外层带来的易用性。不过,这是一个很好的练习。依赖标准Java类往往太容易了,这些类使事情变得简单,而忘记了真正发生的事情。我我不是这个问题的专家,我只是对它略知一二,所以我不会告诉你你做的是否正确。但是,我确实认为你应该看看你的风格。试着把东西隔开一些。这会让它更容易阅读。一旦这段代码起作用,我建议将它发布到codereview.stackexchange.com,一个s社区对你的“这是可以通过的代码吗?”问题会很满意。代码是功能性的,我可能会提交给他们审查,以获得一般性的改进建议。具体的问题是“如何使用int[][]来实现这一点”如何?我想这是属于这里的。我一直在试图理解你的代码,但我对主代码的第三行感到困惑。你似乎在主代码中添加了N_盘堆栈。我认为你需要两个主循环,新的循环在你现在的循环之前添加了N_盘堆栈。目前我认为如果你尝试使用N_盘nextMove (int[] world, int targetPeg) { move = no move for(int i = 0; i < world.length; i++) { if(world[i] != targetPeg) { move = from world[i] to targetPeg targetPeg = ∈ {1,2,3} ∖ {world[i],targetPeg} } } return move; }