Permalänk

Hjälp med java-uppgift

Jag försöker lösa en uppgift där man ska validera om en 3x3 array enbart innehåller siffrorna 1-9 som i soduku.
koden funkar som den är nu men det känns som om den går att lösa utan att använda boolean arrayet för att checka som jag gör på slutet. Kan jag lägga in något smartare i if-satsen i den nästlade loopen för att avbryta direkt när ett "fel" upptäcks?

public static boolean isValidSudokuMatrix(int[][] matrix){ boolean[] test = new boolean[9]; for(int i = 1; i<=9;i++){ for(int j = 0;j<3;j++){ for(int k = 0;k<3;k++){ if(matrix[j][k] == i ){ test[i-1]=true; break; } } } } for(boolean x:test){ if(!x){ return false; } } return true; } public static void main(String[] args) { final int[][] validSudokuMatrix = {{1,7,3},{4,5,6},{2,8,9}}; final int[][] inValidSudukoMatrix = {{1,2,3},{4,5,6},{4,8,9}};

Permalänk
Medlem

Hej
Att använda ett fält med sanningsvärden fungerar ganska bra i detta fall, men du kan undvika att iterera alla olika siffror. Det räcker med att iterera över matrisen och kontrollera om siffran redan är läst: om så är fallet, returnera falskt. För att ta hand om tal större än 9 och mindre än 1 kan vi fånga det undantagstillståndet och returnera falskt.

public static boolean isValidSudokuMatrix(int[][] matrix){ boolean[] test = new boolean[9]; for(int j=0;j<3;j++) for(int k=0;k<3;k++) try{ if(test[matrix[j][k]-1]) return false; else test[matrix[j][k]-1] = true; }catch(IndexOutOfBoundsException e) {return false;} return true; }