例如,假设我们有一个Sudoku板,如下所示:

0 0 6 5 8 9 7 4 3
0 5 0 0 0 0 0 6 0
7 0 9 0 6 0 1 0 0
0 3 0 0 0 2 0 8 7
0 0 1 0 0 0 4 0 0
8 9 0 6 0 0 0 5 0
0 0 2 0 5 0 3 0 6
0 7 0 0 0 0 0 9 0
3 1 8 4 9 6 5 0 0


我想将其存储到一个数组中,以便该数组的前9个元素是第一个子块,即值{0 0 6 0 5 0 7 0 9}然后是{5 8 9 0 0 0 0 6 0}

我试图找到一种解决方案,但是我总是得到超出范围错误的数组索引,并且它太强了。类似于以下内容:

          while(st.hasMoreTokens()) {
            if(ctr == 27) {
                c.addSubBlock(sb1);
                c.addSubBlock(sb2);
                c.addSubBlock(sb3);
                sb1 = new SubBlock();
                sb2 = new SubBlock();
                sb3 = new SubBlock();
                ctr = 0;
            }
            sb1.addElement(Integer.parseInt(st.nextToken()));
            sb1.addElement(Integer.parseInt(st.nextToken()));
            sb1.addElement(Integer.parseInt(st.nextToken()));
            sb2.addElement(Integer.parseInt(st.nextToken()));
            sb2.addElement(Integer.parseInt(st.nextToken()));
            sb2.addElement(Integer.parseInt(st.nextToken()));
            sb3.addElement(Integer.parseInt(st.nextToken()));
            sb3.addElement(Integer.parseInt(st.nextToken()));
            sb3.addElement(Integer.parseInt(st.nextToken()));
            ctr+=9;
        }


请给我一些提示。代码段也将有很大的帮助。

编辑:这thread以某种方式帮助我弄清楚了。是的,这是Sudoku的一部分,我正在尝试将开发板编码成一个数组。

我要做的是先将输入String转换为2d数组(9x9),然后使用int block = (row/3)*3 + (col/3);精确计算每个元素属于哪个子块。

最佳答案

创建一个3x3的子块数组
使用2个计数器(x&y)跟踪读取的每个元素在全板上的位置
将(x,y)处的值添加到子块(x / 3,y / 3)中


像这样:

SubBlock board[][] = new SubBlock[3][3];
int x, y;
for ( y=0; y<9; y++ )
  for ( x=0; x<9; x++ )
    board[y/3][x/3].addElement(Integer.parseInt(st.nextToken()));


board [0] [0]将是左上方的子块,board [2] [2]将是右下方的子块。

关于java - 如何遍历数独板?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9399696/

10-14 04:23