【问题标题】:Sudoku generator: Recursion not working数独生成器:递归不起作用
【发布时间】:2016-04-19 10:08:38
【问题描述】:

我想要完成的事情:

while(there are empty squares)
   get a random number of the remaining numbers
   if(the number hasn't been tried before)
      if(it fits)
        place it and remove from available
        next square
   if(all numbers have been tried)
       forget it
       move back a square and try a different number

这个循环在 availableNumbers = 64 处停止,有时是 37,有时是 81 等等。是什么阻止了它一路运行?为什么有时卡住有时回退?

while(availableNumbers.size()>0){
            rand = rn.nextInt(availableNumbers.size());
            number = availableNumbers.get(rand);
            if(number != triedNumbers[y][x][number-1]){    // If the number hasn't been tried in this square
                if(!checkConflict(number)){
                    squares[y][x].setText(""+number);
                    availableNumbers.remove(new Integer(number));
                    addedNumbers[y][x] = number;
                    triedNumbers[y][x][number-1] = number;
                    moveAhead();
                }
            }
            if(Arrays.equals(triedNumbers[y][x],refArray)){    // If all numbers have been tried in that square
                emptySquare();    // Forget all numbers tried in current square
                moveBack();
            }
}

emptySquare、moveBack、moveAhead 和 checkConflicts 都可以正常工作(根据我的测试)。这是他们的要点:https://gist.github.com/WQvist/ac4296fb3a86fdc3d713

编辑:我终于解决了。感谢所有的帮助。看我的回答。

【问题讨论】:

  • 我不知道是不是这个问题,但是你为什么要把number换成一个新的Integer呢?
  • 因为我想删除那个特定的数字,而不是索引。 availableNumbers 是所有将出现在棋盘上的数字的列表。
  • @guy 这是不正确的。由于集合在基于 0 的索引上工作,因此范围实际上是 0 到 availableNumbers.size()-1
  • 我不知道这是否是问题,但random.nextIntexclusive 的最高值,即如果availableNumbers.size() 是9 number 将在0 - 8 的范围内。在@ 987654331@ 你使用[number-1] 所以你缺少一列。
  • @CalvinP。我的错,谢谢。我编辑了评论。

标签: java recursion generator sudoku


【解决方案1】:

解决了!

while(currentSquare<81){
            rand = rn.nextInt(availableNumbers.size());
            number = availableNumbers.get(rand);
            if(square[currentSquare].contains(number)){
                square[currentSquare].remove(new Integer(number));
                if(!checkConflict(number)){
                    squares[y][x].setText(""+number);
                    addedNumbers[y][x] = number;
                    availableNumbers.remove(rand);
                    moveAhead();
                    currentSquare++;
                }
            }
            if(currentSquare < 81){
                while(square[currentSquare].isEmpty()){
                    square[currentSquare].addAll(refList);
                    addedNumbers[y][x] = 0;
                    availableNumbers.addAll(refList);
                    moveBack();
                    if(currentSquare>=1){
                        currentSquare--;
                    }
                }
            }
        }

【讨论】:

    【解决方案2】:

    您的伪代码不正确。应该是:

    while(there are empty squares)
       get a random number of the remaining numbers
       if(the number hasn't been tried before)
          if(it fits)
            place it and remove from available
            next square
       while(all numbers have been tried)
           forget it
           move back a square
       try a different number
    

    您有时必须返回不止一个方格才能到达尚未尝试所有数字的方格。

    【讨论】:

    • 我明白你的意思,我实现了它。还是不行。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 2016-09-07
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多