2009-07-27 164 views
1

這是我正在爲Java intro介紹的一個學校問題。該任務是編寫一個程序,該程序生成隨機生成的二進制數的8 x 8矩陣,並讓程序檢查哪些列(如果有的話)列都是0,以及主要和次要對角線是否也包含零。主對角線是從左上角到右下角形成的對角線(即在此情況下爲arrayName[0][0]arrayName[8][8]),而小對角線是從矩陣的右上角至左下角的對角線。查找二維數組的主對角線和次對角線是否由0組成

我已經得到了一切工作,除了檢查主要和次要對角線的部分,我不明白爲什麼這不起作用。我一直試圖做的只是計算對角線上零點的數量,如果這個數字是8,那麼你已經有了一個由0組成的對角線。這裏有兩種方法,我對主要和次要陣列:

public static void majorDiagonal(int[][] board) { 
    byte count = 0; 

    for(int row = board.length - 1, offsetNumber = board.length - 1; row > 0; row--, offsetNumber--) 
     for(int column = board.length - 1; column > 0; column--) 
      if(board[row][offsetNumber] == 0) count++; 

    if(count == 8) System.out.println("All zeroes on the major diagonal"); 
} 

public static void minorDiagonal(int[][] board) { 
    byte count = 0; 

    for(int row = board.length - 1, offsetNumber = 0; row > 0; row--, offsetNumber++) 
     for(int column = board.length - 1; column > 0; column--) 
      if(board[row][offsetNumber] == 0) count++; 

    if(count == 8) System.out.println("All zeroes on the minor diagonal"); 
} 

,我遇到了,當我試圖在for循環計數找到主對角線一個有趣的錯誤,即:

for(int row = 0; row< board.length; row++) 
    for(int column = 0; column < board.length; column++) 
     if(board[row][row] == 0) count++; 

該代碼不起作用,但是如果對角線全部爲1並且爲單個0,則即使變量count不是8,也會打印「主要對角線上的全零」。

希望這是有道理的,感謝您的任何幫助。

回答

0

您的對角元素在board[0][0],board[1][1],board[2][2],所以不需要兩個循環。這只是board[i][i]

public static void majorDiagonal(int[][] board) 
{ 
    byte count = 0; 
    for (int i = 0; i < board.length; ++i) 
    { 
     if (board[i][i] == 0) count++; 
    } 
    if(count == board.length) System.out.println("All zeroes on the major diagonal"); 
} 

和未成年人是相似的。 board[0][7], board[1][6], board[2][5],我們可以簡化爲board[i][board.length-1-i]

public static void minorDiagonal(int[][] board) 
{ 
    byte count = 0; 
    for (int i = 0; i < board.length; ++i) 
    { 
     if (board[i][board.length-1-i] == 0) count++; 
    } 
    if(count == board.length) System.out.println("All zeroes on the minor diagonal"); 
} 
+0

雖然在最終檢查中使用`length`而不是`literal`可能值得使用(因爲您在循環中使用它),所以這樣做稍微更通用一些。 – 2009-07-27 23:42:35

+0

好點,我只是複製粘貼來自原始問題的打印行。 – 2009-07-27 23:45:23

7

你太過於複雜了。考慮一下你需要檢查的元素的位置。對於主對角線,指數是:(0,0),(1,1),(2,2),...,(7,7)。現在暫停一下,觀察變化的模式,然後思考:您實際需要多少循環才能生成這樣的序列?小對角線只有表面上的不同:(0,7),(1,6),(2,5),...,(7,0) - 可以改寫爲:(7-7,7),( 7-6,6),(7-5,5),...(7-0,0)。再次考慮你實際需要多少個循環。