2014-10-27 94 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電路板的訪問器將是更好的方法。它會提供數據的含義並且更容易處理。編程的目標是編寫有意義的代碼,以便其他讀取代碼的人瞭解它並可以使用它。因爲在很多情況下,如果你一段時間沒有看過這段代碼,那麼這個人在你的軌道上將會持續幾個月。如果您需要時間閱讀代碼才能理解您的意思,那麼有更好的方法來編寫它。