当前位置: 首页 > 知识库问答 >
问题:

获取数独可能解方法

艾才良
2023-03-14

这是这个问题的后续问题:

从给定的行(x)和列(y)中,找到2D 9x9阵列的3x3子阵列

我正在写一个方法,它采用二维数组的行、列组合,扫描行、列和3x3子数组,在这个特定位置寻找可能的解决方案。到目前为止,一切看起来都很好。第一个for循环扫描行,并将已使用的数字(1-9之间)存储在一个alreadyInUse数组中。第二种方法也适用于列。第三个for循环使用行、列组合确定子数组的位置,搜索这个3x3子数组,并将已经找到的数字存储在同一个alreadyInUse数组中。

// Method for calculating all possibilities at specific position
public int[] getPossibilities(int row, int col){
    int [] alreadyInUse;
    int [] unsorted = new int[9];
    int currentIndex = 0;
    int size = 0;
    boolean match;
    if(sudoku[row][col] != 0){
        return  new int[]{sudoku[col][row]};
    }
    else{
        alreadyInUse = new int[26];
        //Go into Row x and store all available numbers in alreadyInUse
        for(int i=0; i<sudoku.length; i++){
            if(sudoku[row][i] !=0){
                alreadyInUse[currentIndex] = sudoku[row][i];
                currentIndex++;
            }
        }
        //Go into Column y and store all available numbers in alreadyInUse
        for(int j=0; j<sudoku.length; j++){
            if(sudoku[j][col] !=0){
                alreadyInUse[currentIndex] = sudoku[j][col];
                currentIndex++;
            }
        }
        //Go into subarray and store all available numbers in alreadyInUse
        int x_left = row - (row%3);
        int y_top = col - (col%3);
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                if(sudoku[i+x_left][j+y_top] != 0){
                    alreadyInUse[currentIndex] = sudoku[i+x_left][j+y_top];
                }
            }
        }
        //compare 1-9 with the numbers stored in alreadyInUse array
        for(int i=1; i<10; i++){
            match = false;
            //if a pair matches, break;
            for(int j=0; j<alreadyInUse.length; j++){
                if(alreadyInUse[j] == i ){
                    match = true;
                    break;
                }
            }
            //If no pair matches, store the number (i) in an unsorted array
            if(!match){
                size++;
                unsorted[i-1] = i;
            }
        }
        //Re-use alreadyInUse array
        alreadyInUse = new int[size];
        size = 0;
        //Remove the zeros and store the rest of the numbers in alreadyInUse array
        for(int i=0; i<unsorted.length; i++){
            if(unsorted[i] != 0){
                alreadyInUse[size] = unsorted[i];
                size++;
            }
        }
        return alreadyInUse;    
    }   
}

当我像这样测试输出时:

 public class SudokuTest {
 public static void main(String[] args){
    Sudoku sudoku;
    String sud = "250030901010004000407000208005200000000098100040003000000360072070000003903000604";
    sudoku = new Sudoku(sud);
    System.out.println(sudoku.getPossibilities(3,4));

我得到这个作为输出:[I@659e0bfd,即使调试显示我已经Inuse数组包含正确的值。有人能在这里帮忙吗?

共有1个答案

牧业
2023-03-14

您不能直接打印int数组。您需要:

import java.util.Arrays;
...
System.out.println(Arrays.toString(sudoku.getPossibilities(3,4)));
 类似资料:
  • 我正在做一个小的个人数独游戏,并试图扩展它。 到目前为止,我使用递归回溯方法使“Solve”部分正常工作,每当它设法解决递归时,就会返回true。 现在我正在尝试构建一个独特的解决方案板生成器,我在网上找到了很多关于如何实现它的信息。 然而,我在第一步很挣扎,这是我的布尔递归回溯算法变成一个递归算法,它保留了一个可能解决方案的计数。这对于检查我生成的板是否是唯一的至关重要。 更重要的是,我意识到我

  • 如何在java摆中从第二个JFrame获取数据?我有一个带有JLabel和JButton的帧。单击JButton时,它会打开另一个带有自定义日历的帧。我想选择日期(通过JButton)并将日期放在主JFrame的JLabel中。我不想创建第一帧的新实例,因为还有其他用户可能键入的我不想删除的信息。

  • 本文向大家介绍用Python解数独的方法示例,包括了用Python解数独的方法示例的使用技巧和注意事项,需要的朋友参考一下 芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独。数独是 9 横 9 竖共有 81 个格子,同时又分为 9 个九宫格。规则很简单:每个空格填入 1~9 任意一个数字,需要保证每个横排和竖排以及九宫格内无相同数字。 解数独是一个可有可无的爱好,知道这个益智游戏,但

  • 我正在尝试使用Java解决一个数独难题。目前该类无法正确解数独。 此类尝试在9x9矩阵中查找0(空格),并在列表中记下0的位置,以供以后参考。然后,它将使用这些位置来求解该0。不幸的是,它似乎不像我希望的那样起作用。 这是我使用的9x9矩阵: 这个9x9矩阵中有51个0,但是当它解决这个难题时,出于某种奇怪的原因,它会附加66个位置。我似乎无法准确指出问题所在。任何帮助都将不胜感激! 这是它尝试的

  • 问题内容: 我有1100、1002、1022等数字。我想使用单个数字,例如,对于第一个数字1100,我希望具有1、1、0、0。 如何用Java获取它? 问题答案: 为此,你将使用(mod)运算符。 mod运算符将为你提供对int进行除法运算的其余部分。 所以, 因为: 注意:如Paul所述,这将为你提供相反的数字。你将需要将它们压入堆栈并以相反的顺序弹出。 代码以正确的顺序打印数字: