B
bPmMaN
Gast
hallo zusammen!
ich habe da ein paar kleine probleme beim erstellen eines sudokus. ich möchte gerne das ein sudoku erstellt wird, der nur EINE lösung hat und 3 schwierigkeitstufen hat. ich bekomme den backtracking-algo irgendwie nicht hin. ich habe mir schon mehrere seiten und foren angeguckt, aber ich bekomme es irgendwie nicht auf meinen source übertragen. wäre echt nett, wenn ihr mir weiterhelfen könntet.
hier ist der relevante code (fehlen tut eigentlich nur was bei CSolver
ich hoffe es ist halbwegs verständlich und ihr habt alle daten die ihr braucht.
ich habe da ein paar kleine probleme beim erstellen eines sudokus. ich möchte gerne das ein sudoku erstellt wird, der nur EINE lösung hat und 3 schwierigkeitstufen hat. ich bekomme den backtracking-algo irgendwie nicht hin. ich habe mir schon mehrere seiten und foren angeguckt, aber ich bekomme es irgendwie nicht auf meinen source übertragen. wäre echt nett, wenn ihr mir weiterhelfen könntet.
hier ist der relevante code (fehlen tut eigentlich nur was bei CSolver
Code:
//*******************CSolver*********************
public class CSolver
{
private CSolver()
{}
public static CGrid createPuzzle( )
{
//CODE FEHLT
//erstellen eines kompletten sudkokus
}
public static CGrid createStartGrid( CGrid solution, int difficulty )
{
//CODE FEHLT
//legt die startfelder fest die am anfang zusehen sind, abhängig vom schwierigkeitsgrad
}
public static CGrid solve( CGrid gridToSolve )
{
//CODE FEHLT
//das übergebene grid soll gelöst werden
}
}
//******************CGrid***********************
public class CGrid
{
private int m_data[][] = new int[9][9];
public static final int EMPTY=-1;
public CGrid()
{
reset();
}
public void reset()
{
for( int i=0;i<9;i++)
{
for( int j=0;j<9;j++)
{
m_data[i][j] = EMPTY;
}
}
}
public CGrid Clone()
{
CGrid copy = new CGrid();
for( int i=0;i<9;i++)
{
for( int j=0;j<9;j++)
{
copy.m_data[i][j] = m_data[i][j];
}
}
return copy;
}
public int getValueAt(int row, int col)
{
return m_data[row][col];
}
public void setValueAt(int value, int row,int col)
{
m_data[row][col] = value;
}
public int[][] getGrid()
{
return m_data;
}
public boolean isNumberInRow(int value, int row, int col)
{
for (int i = 0; i < 9; i++) {
if (i == col)continue;
if (m_data[row][i] == value)
return true;
}
return false;
}
public boolean isNumberInCol(int value, int row, int col)
{
for (int i = 0; i < 9; i++) {
if (i == row)continue;
if (m_data[i][col] == value)
return true;
}
return false;
}
public boolean isNumberInBox(int value, int row, int col)
{
int boxNum = getBoxFromPos(row, col);
for (int i = 0; i < 9; i++) {
if (CPosition.boxes[boxNum][i].row == row &&
CPosition.boxes[boxNum][i].col == col)continue;
if (m_data[ CPosition.boxes[boxNum][i].row ][ CPosition.boxes[boxNum][i].col ] == value )
{
return true;
}
}
return false;
}
public int getBoxFromPos(int row, int col)
{
int idxBoxRow = row / 3;
int idxBoxCol = col / 3;
return 3 * idxBoxRow + idxBoxCol;
}
public boolean isValidPos(int value, int row, int col)
{
if ( m_data[row][col] != EMPTY )return false;
if (!isNumberInBox(value, row, col) &&
!isNumberInCol(value, row, col) &&
!isNumberInRow(value, row, col) )return true;
return false;
}
public boolean isAllCorrect()
{
int boxValue, colValue, rowValue;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
boxValue = m_data[i][j];
colValue = m_data[j][i];
rowValue = m_data[i][j];
if (boxValue != EMPTY)
if(isNumberInBox(boxValue, i, j) )
return false;
if (colValue != EMPTY)
if(isNumberInCol(colValue, j, i) )
return false;
if (rowValue != EMPTY)
if(isNumberInRow(rowValue, i, j))
return false;
}
}
return true;
}
}
//*****************CPosition************************
public class CPosition
{
public int row;
public int col;
Aufbau des Grids(der boxen)
box0-----------box1------------box2
box3-----------box4------------box5
box6-----------box7------------box8
//welche box hat welche positionen
public static final CPosition[][] boxes =
{
/*box0*/ {new CPosition(0,0),new CPosition(0,1),new CPosition(0,2),new CPosition(1,0),new CPosition(1,1),new CPosition(1,2),new CPosition(2,0),new CPosition(2,1),new CPosition(2,2)},
/*box1*/ {new CPosition(0,3),new CPosition(0,4),new CPosition(0,5),new CPosition(1,3),new CPosition(1,4),new CPosition(1,5),new CPosition(2,3),new CPosition(2,4),new CPosition(2,5)},
/*box2*/ {new CPosition(0,6),new CPosition(0,7),new CPosition(0,8),new CPosition(1,6),new CPosition(1,7),new CPosition(1,8),new CPosition(2,6),new CPosition(2,7),new CPosition(2,8)},
/*box3*/ {new CPosition(3,0),new CPosition(3,1),new CPosition(3,2),new CPosition(4,0),new CPosition(4,1),new CPosition(4,2),new CPosition(5,0),new CPosition(5,1),new CPosition(5,2)},
/*box4*/ {new CPosition(3,3),new CPosition(3,4),new CPosition(3,5),new CPosition(4,3),new CPosition(4,4),new CPosition(4,5),new CPosition(5,3),new CPosition(5,4),new CPosition(5,5)},
/*box5*/ {new CPosition(3,6),new CPosition(3,7),new CPosition(3,8),new CPosition(4,6),new CPosition(4,7),new CPosition(4,8),new CPosition(5,6),new CPosition(5,7),new CPosition(5,8)},
/*box6*/ {new CPosition(6,0),new CPosition(6,1),new CPosition(6,2),new CPosition(7,0),new CPosition(7,1),new CPosition(7,2),new CPosition(8,0),new CPosition(8,1),new CPosition(8,2)},
/*box7*/ {new CPosition(6,3),new CPosition(6,4),new CPosition(6,5),new CPosition(7,3),new CPosition(7,4),new CPosition(7,5),new CPosition(8,3),new CPosition(8,4),new CPosition(8,5)},
/*box8*/ {new CPosition(6,6),new CPosition(6,7),new CPosition(6,8),new CPosition(7,6),new CPosition(7,7),new CPosition(7,8),new CPosition(8,6),new CPosition(8,7),new CPosition(8,8)}
};
public CPosition()
{
row=-1;
col=-1;
}
public CPosition( int row, int col )
{
this.row = row;
this.col = col;
}
public String toString()
{
return getClass().getName()+" [Reihe="+row+" Spalte="+col+"]";
}
}
//******************CStack*********************
public class CStack
{
private Vector m_moves;
public CStack()
{
m_moves = new Vector(81);
}
public CStack( int stackSize )
{
m_moves = new Vector(stackSize);
}
public void push(CMove move)
{
if(m_moves.size() == m_moves.capacity())
m_moves.removeElementAt(0);
m_moves.add(move);
}
public CMove pop()
{
CMove copy = (CMove)m_moves.lastElement();
m_moves.remove(m_moves.lastElement());
return copy;
}
public void removeAllElements()
{
m_moves.removeAllElements();
}
public Vector getAllMoves()
{
return m_moves;
}
public void deleteMove( CMove move)
{
m_moves.remove(move);
}
public int size()
{
return m_moves.size();
}
public CMove getElementAt( int index )
{
return (CMove)m_moves.elementAt( index );
}
public void deleteElementAt(int row, int col)
{
for(int i=0; i<m_moves.size();i++)
{
if( ((CMove)m_moves.elementAt(i)).getPosition().row == row && ((CMove)m_moves.elementAt(i)).getPosition().col == col )
{
m_moves.removeElementAt( i );
}
}
return;
}
public CMove getLastMove()
{
return (CMove)m_moves.lastElement();
}
public String toString()
{
String output = "";
for(int i=0;i<m_moves.size();i++)
{
output += ((CMove)m_moves.elementAt(i)).toString()+"\n";
}
return output;
}
}
//*********************CMove***************************
public class CMove
{
//position auf dem grid (reihe & spalte)
private CPosition position = new CPosition();
//der wert der an die position gesetzt werden soll
public int value;
//der wert der dem zug an der position war
public int oldGridValue;
public CMove()
{
value = -1;
oldGridValue = -1;
position.row = -1;
position.col = -1;
}
public CMove(CPosition pos, int value, int oldValue )
{
position = pos;
this.oldGridValue = oldValue;
this.value = value;
}
public CMove( int value, int oldValue, int row, int col )
{
position.row = row;
position.col = col;
this.value = value;
this.oldGridValue = oldValue;
}
public CPosition getPosition()
{
return position;
}
public String toString()
{
return getClass().getName()+" [Reihe="+position.row+" Spalte="+position.col+" Wert="+value+" Alter Wert="+oldGridValue+"]";
}
}
ich hoffe es ist halbwegs verständlich und ihr habt alle daten die ihr braucht.