Sudokuprogrammering
Hej!
Jag har fastnat på denna uppgift:
Klassen SudokuGrid nedan beskriver rutnätet i sudoku:
public class SudokuGrid {
private int[][] grid;
/** Constructd an empty sudoku. */
public SudokuGrid () {...}
/** Sets the value value in the box (row, col).
All arguments are assumed to have a value between 1 and 9. */
public void put(int row, int col, int value) {...}
/** Clears the the box (row,col).
All arguments are assumed to have a value between 1 and 9. */
public void clear(int row, int col) {...}
/** Returns the value in the box (row,col), zero if the box is empty.
All arguments are assumed to have a value between 1 and 9. */
public int get(int row, int col) {...}
/** Determines if the box (row, col) is empty.
All arguments are assumed to have a value between 1 and 9. */
public boolean empty(int row, int col) {...}
}
Uppgift: Skriv en metod checkRow(int row) som är tänkt att läggas till i klassen SudokuGrid. Metoden ska kontrollera om raden row i sudokurutnätet är korrekt, d.v.s. om rutorna antingen är tomma eller, om inte tomma, bara innehåller siffrorna 1-9 helt utan dubbletter. Metoden ska returnera ett värde av typen boolean: false om det finns dubbletter eller felaktiga siffror annars true.
Tips:
- Den här uppgiften kan (precis som de flesta övriga uppgifter) lösas på många olika sätt. Ett alternativ är att använda en vektor av typen boolean[] för att hålla reda på vilka siffror som träffats på tidigare på raden.
- En tom ruta motsvaras av värdet 0 och det är tänkt att metoden kan anropas på ett ofärdigt sudoku för att varna användaren för felaktiga siffror, och då är tom ruta inte felaktigt. Värdet 0 får således förekomma flera gånger
- Metoden som du ska skriva antas alltså att vara en del av klassen ovan och kommer också testas som en del av en färdig sudokuklass. Det betyder att den interna matrisen som metoden använder måste heta grid (som ovan) och grid antas ha 9x9 rutor indexerat från noll och uppåt. Den som använder klassen skickar in rad- och kolonnummer mellan 1 och 9, vilket gör att du behöver justera ner parametern (eftersom grid är indexerad mellan 0 och 8).
Exempel: Om sudokuprogrammet vill anropa checkRow för första raden kommer den att skicka in värdet 1, men din metod måste då skifta ner parametern ett steg så att metoden faktiskt tittar på siffrorna som ligger på rad 0 i matrisen.
Min kod än så länge:
public boolean checkRow(int row) {
boolean korrekt = true;
row = row -1;
int[] v = new int [grid.length]; //skapas en ny vektor för varje rad
for (int col = 0; col < grid[row].length; col++) {
int x = grid[row][col]; //lägger in värdet från row och col i x
for (int i = 0; i < v.length; i++) { //söker i vektorn om detta objekt finns sen innan
if (x != v[i] || x == 0) { //om objektet inte finns sen innan eller är 0 läggs det in
v[row] = x; //lägger in det en och ett i vektorn
} else {
korrekt = false;
}
}
}
return korrekt;
}
Jag lyckas få nästan alla tester rätt förutom 2 st och nu vet jag inte hur jag kommer längre i min kod.
Du lägger alltid in x på samma ställe i v, för row ändras inte.
Laguna skrev:Du lägger alltid in x på samma ställe i v, för row ändras inte.
Ändrade till att x läggs in på v[col] istället för v[row], men får samma felmeddelande