Sudoku mit Backtracking lösen

azom

Mitglied
Hey meine lieben Freunde!

(kurzer Hinweis: ist für die Schule, will aber keinen vorgekauten Code, glaub ich steh grad bei der 90%-Marke auf der Leitung, hoffe desshalb auf das magische Paar zweite Augen)

Aufgabe ist, ein Sudoku-Feld(9x9) mit Hilfe des Backtracking-Algorithmus(rekursiv) zu lösen.

Derzeit zweifle ich jedoch ein wenig an daran, dass meine Überprüfung vollkommen funktioniert.

Java:
//Überprüfung der 9 3x3-Blöcke
//SudoCell ist nur ein Container zum leichteren Herrumreichen einer Zellenkoordinate.
private boolean checkBlock(SudoCell cell)
	{		
		int row=cell.getRow();
		int column=cell.getColumn();
			if(row<3){
				if(column<3){
					return blockContains(field.collectBlockCells(0, 0), cell);
				}
				else if(column>5){
					return blockContains(field.collectBlockCells(0, 6), cell);
				}
				else{
				return blockContains(field.collectBlockCells(0, 3), cell);
				}
			}
                //für die mittlere und die untere Blockreihe siehts ident aus, nur mit den Parameter
                //(3,x) bzw. (6,x).
}

public ArrayList<SudoCell> collectBlockCells(int startRow, int startColumn)
	{
		ArrayList<SudoCell> temp = new ArrayList<SudoCell>();
		
			for(int i=0; i<3; i++)
			{
				for(int n=0; n<3; n++)
				{
					temp.add(getCell(i+startRow,n+startColumn));
				}
			}
		//printCellList(temp);
		return temp;
	}

private boolean blockContains(ArrayList<SudoCell> cells, SudoCell cell)
	{		
			for(SudoCell c:cells)
			{
				if(cell.getValue()==c.getValue())
				{
					if(cell.getId()!=c.getId())
					{
						return false;
					}
				}
			}
		return true;
	}

private boolean checkLines(SudoCell cell)
	{
		int row=cell.getRow();
		int column=cell.getColumn();
		SudoCell temp;
		
			for(int i=0; i<9; i++)
			{
				temp=field.getCell(i, column);
				
					if(temp.getValue()==cell.getValue())
					{
						if(temp.getId()!=cell.getId())
						{
							return false;
						}
					}
					
				temp=field.getCell(row, i);
					
					if(temp.getValue()==cell.getValue())
					{
						if(temp.getId()!=cell.getId())
						{
							return false;
						}
					}
			}
			
		return true;
	}

Bei Unklarheiten beanworte ich gerne alles oder liefere weiteren Code. (erscheint mir nur schon ein wenig viel zum mal schnell drüberfliegen)

Bin für jede Anregung sehr Dankbar!
-Thomas
 

Zurück
Oben