G
Guest
Gast
Hallo zusammen,
ich habe stunden im Debugmodus zugebracht komme aber nicht auf einen grünen Zweig. Ich immer noch ein Sudoku erstell. Zunächst betrachte ich nur Zeilen und Spalten. Mit einem 3 mal 3 Feld geht das Programm. Hier meine allgemeine Vorgehensweise:
1. Ich generiere 9 mal zufallszahlen zwischen 1 und 9 und speichere sie in random[81]
2. Von den 81 generierten Zahlen nehme ich die erste und führe folgende Aktionen durch:
-->suche eine freie Stelle im Spielfeld
-->setze die Zahl auf die erste freie stelle
-->prüfe ob die Zahl nach den Regeln dort stehen darf
-->wenn kein Regelverstoß vorliegt fahre ich mit der zweiten Zahl aus random[] fort
-->liegt ein Regelverstoß vor, setze ich die zuvor gesetzte Zahl eine Position weiter.
3. kann eine Zahl nicht weitergesetzt werden, gehe ich nochmals zurück
-->usw....
Ich hoffe es ist einigermaßen nachvollziehbar. Ich möchte mich noch einmal entschuldigen, für den unkommentierten code vom letzen mal.
Hier ist jetz ein verbessterter und kommentierter code.
Ich würde nicht nochmals fragen wenn ich wirklich nicht weiter kommen würde.
Euer JavaMaximum5000
ich habe stunden im Debugmodus zugebracht komme aber nicht auf einen grünen Zweig. Ich immer noch ein Sudoku erstell. Zunächst betrachte ich nur Zeilen und Spalten. Mit einem 3 mal 3 Feld geht das Programm. Hier meine allgemeine Vorgehensweise:
1. Ich generiere 9 mal zufallszahlen zwischen 1 und 9 und speichere sie in random[81]
2. Von den 81 generierten Zahlen nehme ich die erste und führe folgende Aktionen durch:
-->suche eine freie Stelle im Spielfeld
-->setze die Zahl auf die erste freie stelle
-->prüfe ob die Zahl nach den Regeln dort stehen darf
-->wenn kein Regelverstoß vorliegt fahre ich mit der zweiten Zahl aus random[] fort
-->liegt ein Regelverstoß vor, setze ich die zuvor gesetzte Zahl eine Position weiter.
3. kann eine Zahl nicht weitergesetzt werden, gehe ich nochmals zurück
-->usw....
Ich hoffe es ist einigermaßen nachvollziehbar. Ich möchte mich noch einmal entschuldigen, für den unkommentierten code vom letzen mal.
Hier ist jetz ein verbessterter und kommentierter code.
Ich würde nicht nochmals fragen wenn ich wirklich nicht weiter kommen würde.
Euer JavaMaximum5000
Code:
import java.util.BitSet;
import java.util.Random;
public class Sudoku {
public static void main(String[] args) {
int random[] = new int[81]; //random is for the random numbers
int pointer[] = new int[81]; //pointer knows which random number is already set
int tmp[] = new int[1]; //includes the current random number to set
int field[][] = new int[9][9]; //the final field
boolean statussetrandomnumbertogame = false;
boolean status = false;
int transfer[] = new int[2];
//create random numbers
createnumbers(random);
//status is false as long as the field is not complete
while(status == false){
status = checkpointer(pointer);
transfer[0] = 0;
transfer[1] = 0;
//get the next number to the field
nextnumber(random, pointer, tmp);
//set the number to the field
statussetrandomnumbertogame = setrandomnumbertogame(tmp, field, transfer,pointer);
printpointer(pointer);
printfield(field);
//do backtracking as long as statussetrandomnumbertogame is false
while(statussetrandomnumbertogame == false){
backtracking(pointer,tmp,random,field, transfer);
statussetrandomnumbertogame = true;
}
}
//finish, print out the game
printpointer(pointer);
printfield(field);
}
/*
This function spends the pointers.
1 = The Random Number at this position was set.
0 = The Random Number at this position was not set.
*/
private static void printpointer(int[] pointer) {
for(int i = 0; i < 81; i++){
System.out.print(pointer[i]);
}
System.out.println();
}
/*
This function prints the field out.
The quantity of the 0 numbers must be equal to the 0 numbers of the print pointer function.
*/
private static void printfield(int[][] game) {
for(int y = 0; y < 9; y++){
for(int x = 0; x < 9; x++){
System.out.print(game[y][x]+ " ");
}
System.out.println();
}
}
/*
The function checks every place in the array. If the number on every position
is on 1, the sudoku is set up.
*/
private static boolean checkpointer(int[] pointer) {
for(int i = 0; i < 80; i++){
if(pointer[i] == 0){
return false;
}
}
return true;
}
/*
If it is not possible to set the current number into the field, this function
takes the last set number and put it into the next free position. This function is
recursive
*/
private static void backtracking(int[] pointer, int[] tmp, int[] random, int[][] game,int transfer[]) {
boolean statussetrandomnumbertogame = false;
int i = 0;
boolean status = false;
//get the last set number
//I guess here is a special case missing
while(status == false){
if(pointer[i] == 0){
if(i == 0){
tmp[0] = random[i];
status = true;
}
else{
pointer[i-1] = 0;
tmp[0] = random[i-1];
status = true;
}
}
i++;
}
//set the last set number into the next free position
//I guess here is a special case missing
for(int row = 8; row >= 0; row--){
for(int column = 8; column >= 0; column--){
if(game[row][column] == tmp[0]){
game[row][column] = 0;
if(column == 8 && row < 8){
transfer[0] = row + 1;
transfer[1] = 0;
statussetrandomnumbertogame = setrandomnumbertogame(tmp, game, transfer,pointer);
if(statussetrandomnumbertogame == false){
//recursive call of the backtrack function
backtracking(pointer,tmp,random,game, transfer);
}
return;
}
if(column == 8 && row == 8){
transfer[0] = 8;
transfer[1] = 8;
//recursive call of the backtrack function
backtracking(pointer,tmp,random,game, transfer);
return;
}
else{
transfer[0] = row;
transfer[1] = column + 1;
statussetrandomnumbertogame = setrandomnumbertogame(tmp, game, transfer,pointer);
if(statussetrandomnumbertogame == false){
//recursive call of the backtrack function
backtracking(pointer,tmp,random,game, transfer);
}
return;
}
}
}
}
}
/*
sets the next number to the field
If there is no way in setting up the number, the function returns false
and the backtrack function is called
*/
private static boolean setrandomnumbertogame(int[] tmp, int[][] game, int transfer[], int[] pointer) {
boolean status = true;
for(int row = transfer[0]; row < 9; row++){
for(int column = transfer[1]; column < 9; column++){
if(game[row][column] == 0){
game[row][column] = tmp[0];
status = checknumber(game, row, column);
if(status == true){
for(int i = 0; i < 81; i++){
if(pointer[i] == 0){
pointer[i] = 1;
return true;
}
}
}
else{
game[row][column] = 0;
}
}
}
}
return false;
}
/*
checks the number on a breach of the rules
*/
private static boolean checknumber(int[][] game, int row, int column) {
boolean statusrow = false;
boolean statuscolumn = false;
statusrow = checkrow(game, row, column);
statuscolumn = checkcolumn(game, row, column);
if(statusrow == true && statuscolumn == true){
return true;
}
return false;
}
/*
checks the columns on a breach of the rules
*/
private static boolean checkcolumn(int[][] game, int row, int column) {
for(int y = 0; y < 9; y++){
if(row == y){
}
else if(game[row][column] == game[y][column]){
return false;
}
}
return true;
}
/*
checks the rows on a breach of the rules
*/
private static boolean checkrow(int[][] game, int row, int column) {
for(int x = 0; x < 9; x++){
if(column == x){
}
else if(game[row][column] == game[row][x]){
return false;
}
}
return true;
}
/*
Creates 9 times random numbers from 1 to 9
*/
private static void createnumbers(int random[]) {
Random randomnumber = new Random();
for(int y = 0; y < 81; y = y + 9){
BitSet generatednumber = new BitSet();
for(int x = 0; x < 9; x++){
int number = 1 + Math.abs(randomnumber.nextInt()) % 9;
if(! generatednumber.get(number)){
generatednumber.set(number);
random[y+x] = number;
}
else x--;
}
}
}
/*
*/
private static void nextnumber(int[] random, int[] pointer, int[] tmp) {
for(int i = 0; i < 81; i++){
if(pointer[i] == 0){
tmp[0] = random[i];
return;
}
}
}
}