2014-10-27 95 views
1

我在java中编写一个Sudoku求解器,并想知道如何使用charAt或其他东西将字符串中的值赋值给2d数组? 例如,这是printboard样子:如何将字符串中的值赋给2d数组?

 1 2 3 4 5 6  7 8 9  
    +-----------+-----------+-----------+ 
A | 0 0 0 | 0 0 5 | 0 9 0 | 
B | 1 4 0 | 0 0 0 | 6 7 0 | 
C | 0 8 0 | 0 0 2 | 4 5 1 | 
    +-----------+-----------+-----------+ 
D | 0 6 3 | 0 7 0 | 0 1 0 | 
E | 9 0 0 | 0 0 0 | 0 0 3 | 
F | 0 1 0 | 0 9 0 | 5 2 0 | 
    +-----------+-----------+-----------+ 
G | 0 0 7 | 2 0 0 | 0 8 0 | 
H | 0 2 6 | 0 0 0 | 0 3 5 | 
I | 0 0 0 | 4 0 9 | 0 6 0 | 
    +-----------+-----------+-----------+ 

,这是我使用的赋值给printboard迄今方式:

public void printBoard() { 

     System.out.print(" "); 
     for (int j = 0; j < 3; j++) 
      System.out.print(" " + (j+1)); 
     System.out.print(" "); 
     for (int j = 3; j < 6; j++) 
      System.out.print(" " + (j+1)); 
     System.out.print(" "); 
     for (int j = 6; j < 9; j++) 
      System.out.print(" " + (j+1)); 
     System.out.print("  "); 
     System.out.println(); 
     System.out.print(" +-----------+-----------+-----------+\n"); 
     char row_letter = 'A'; 
     for (int i = 0; i < 3; i++) { 
      System.out.print(row_letter + " |"); 
      row_letter++; 
      System.out.print(" " + board[i][0] + 
          " " + board[i][1] + 
          " " + board[i][2] + " |" + 
          " " + board[i][3] + 
          " " + board[i][4] + 
          " " + board[i][5] + " |" + 
          " " + board[i][6] + 
          " " + board[i][7] + 
          " " + board[i][8] + " |"); 
      System.out.println(""); 
     } 
     System.out.print(" +-----------+-----------+-----------+\n"); 
     for (int i = 3; i < 6; i++) { 
      System.out.print(row_letter + " |"); 
      row_letter++; 
      System.out.print(" " + board[i][0] + 
          " " + board[i][1] + 
          " " + board[i][2] + " |" + 
          " " + board[i][3] + 
          " " + board[i][4] + 
          " " + board[i][5] + " |" + 
          " " + board[i][6] + 
          " " + board[i][7] + 
          " " + board[i][8] + " |"); 
      System.out.println(""); 
     } 
     System.out.print(" +-----------+-----------+-----------+\n"); 
     for (int i = 6; i < 9; i++) { 
      System.out.print(row_letter + " |"); 
      row_letter++; 
      System.out.print(" " + board[i][0] + 
          " " + board[i][1] + 
          " " + board[i][2] + " |" + 
          " " + board[i][3] + 
          " " + board[i][4] + 
          " " + board[i][5] + " |" + 
          " " + board[i][6] + 
          " " + board[i][7] + 
          " " + board[i][8] + " |"); 
      System.out.println(""); 
     } 
     System.out.print(" +-----------+-----------+-----------+\n"); 
    } 

public static void main(String[] args) { 
     int[][] board = new int[9][9]; 
     board[0][3] = 1; 
     board[0][5] = 5; 
     board[1][0] = 1; 
     board[1][1] = 4; 
     board[1][6] = 6; 
     board[1][7] = 7; 
     board[2][1] = 8; 
     board[2][5] = 2; 
     board[2][6] = 4; 
     board[3][1] = 6; 
     board[3][2] = 3; 
     board[3][4] = 7; 
     board[3][7] = 1; 
     board[4][0] = 9; 
     board[4][8] = 3; 
     board[5][1] = 1; 
     board[5][4] = 9; 
     board[5][6] = 5; 
     board[5][7] = 2; 
     board[6][2] = 7; 
     board[6][3] = 2; 
     board[6][7] = 8; 
     board[7][1] = 2; 
     board[7][2] = 6; 
     board[7][7] = 3; 
     board[7][8] = 5; 
     board[8][3] = 4; 
     board[8][5] = 9; 

我想知道怎么用一个81位数字的字符串,如:"000005090140000670080002451063070010900000003007200080026000035000409060" 在某个位置给打印板赋值,0表示未解决。

+2

考虑到您拥有的行数和列数,您可能会考虑模数(%)和/运算符来计算给定数字所在的行/列。 – 2014-10-27 22:14:08

+0

你究竟想要完成什么?你想从字符串创建你的板结构(2d int数组)还是你想用字符串替换该结构?如果你想实现后者,你可以编写一个函数,它接受一行,一列值和一个数据字符串,并从字符串中返回结果单元格值。我会建议,尽管你开始考虑一种方法,在这种方法中,使用访问/设置其值的方法将板和/或其单元封装在单独的类中。 – markus 2014-10-27 22:24:28

回答

0

要严格回答这个问题,公式

81/9 * row + col 

会给你代表你想要的板位置字符串中的字符位置,只要你使用零个索引的行和列。 因此,像

public String GetBoardValue(int row, int col) 
{ 
    return boardString.CharAt(81/9 * row + col); 
} 

不过要小心,像这样的代码非常脆弱,容易折断。这里使用的数字81和9只在字符串长度为81个字符时才起作用。编程中的“魔术数字”很糟糕。

正如markus提到的,你需要考虑你在这里想要达到的目标。以这种方式的董事会纯粹的字符串表示没有内在的价值或意义。至少二维数组是一个数据表示,更接近Sudoku游戏板。然而,创建自己的对象来封装电路板数据并提供特定于Sudoku电路板的访问器将是更好的方法。它会提供数据的含义并且更容易处理。编程的目标是编写有意义的代码,以便其他读取代码的人了解它并可以使用它。因为在很多情况下,如果你一段时间没有看过这段代码,那么这个人在你的轨道上将会持续几个月。如果您需要时间阅读代码才能理解您的意思,那么有更好的方法来编写它。