In der bittersten Stunde wendet sich euer JavaMaximum5000 an die Runde der Experten. In der Backtrackfunktion (Zeile 42) scheint ein Fehler zu sein. Hab 3 Stunden gesucht, vielleicht könnt ihr mir ja weiterhelfen. Würde mich riesig freuen.
Das Problem liegt darin, dass der Code in der Backtrackfunktion eine Endlosschleife produziert.
Es wird immer Hallo1 oder Hallo2 oder Hallo3 ausgegeben.
Das Programm sollte ein Sudokufeld ausgeben (noch ohne korrekte Blöcke, also nur Zeilen und Spalten)
Anbei der Code.
Euer JavaMaximum5000
Das Problem liegt darin, dass der Code in der Backtrackfunktion eine Endlosschleife produziert.
Es wird immer Hallo1 oder Hallo2 oder Hallo3 ausgegeben.
Das Programm sollte ein Sudokufeld ausgeben (noch ohne korrekte Blöcke, also nur Zeilen und Spalten)
Anbei der Code.
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];
int pointer[] = new int[81];
int tmp[] = new int[1];
int game[][] = new int[9][9];
boolean statussetrandomnumbertogame = false;
int transfer[] = new int[2];
createnumbers(random);
while(pointer[80] == 0){
if(statussetrandomnumbertogame = true){
transfer[0] = 0;
transfer[1] = 0;
}
nextnumber(random, pointer, tmp);
statussetrandomnumbertogame = setrandomnumbertogame(tmp, game, transfer,pointer);
while(statussetrandomnumbertogame == false){
backtracking(pointer,tmp,random,game, transfer);
statussetrandomnumbertogame = setrandomnumbertogame(tmp, game, transfer,pointer);
}
}
for(int y = 0; y < 9; y++){
for(int x = 0; x < 9; x++){
System.out.print(game[y][x]+ " ");
}
System.out.println();
}
}
private static void backtracking(int[] pointer, int[] tmp, int[] random, int[][] game,int transfer[]) {
int i = 0;
boolean status = false;
while(status == false){
if(pointer[i] == 0){
pointer[i-1] = 0;
tmp[0] = random[i-1];
status = true;
}
i++;
}
for(int zeile = 8; zeile >= 0; zeile--){
for(int spalte = 8; spalte >= 0; spalte--){
if(game[zeile][spalte] == tmp[0]){
game[zeile][spalte] = 0;
if(spalte == 8 && zeile < 8){
transfer[0] = zeile + 1;
transfer[1] = 0;
System.out.println("Hallo");
return;
}
if(spalte == 8 && zeile == 8){
transfer[0] = 8;
transfer[1] = 8;
System.out.println("Hallo3");
return;
}
else{
transfer[0] = zeile;
transfer[1] = spalte + 1;
System.out.println("Hallo2");
return;
}
}
}
}
}
private static boolean setrandomnumbertogame(int[] tmp, int[][] game, int transfer[], int[] pointer) {
boolean status = true;
for(int zeile = transfer[0]; zeile < 9; zeile++){
for(int spalte = transfer[1]; spalte < 9; spalte++){
if(game[zeile][spalte] == 0){
game[zeile][spalte] = tmp[0];
status = checknumber(game, zeile, spalte);
if(status == true){
for(int i = 0; i < 81; i++){
if(pointer[i] == 0){
pointer[i] = 1;
return true;
}
}
}
else{
game[zeile][spalte] = 0;
}
}
}
}
return false;
}
private static boolean checknumber(int[][] game, int zeile, int spalte) {
boolean statuszeile = false;
boolean statusspalte = false;
statuszeile = checkzeile(game, zeile, spalte);
statusspalte = checkspalte(game, zeile, spalte);
if(statuszeile == true && statusspalte == true){
return true;
}
return false;
}
private static boolean checkspalte(int[][] game, int zeile, int spalte) {
for(int y = 0; y < 9; y++){
if(zeile == y){
y++;
}
else if(game[zeile][spalte] == game[y][spalte]){
return false;
}
}
return true;
}
private static boolean checkzeile(int[][] game, int zeile, int spalte) {
for(int x = 0; x < 9; x++){
if(spalte == x){
x++;
}
else if(game[zeile][spalte] == game[zeile][x]){
return false;
}
}
return true;
}
private static void createnumbers(int random[]) {
Random zufallszahl = new Random();
for(int y = 0; y < 81; y = y + 9){
BitSet generiertezahlen = new BitSet();
for(int x = 0; x < 9; x++){
int zahl = 1 + Math.abs(zufallszahl.nextInt()) % 9;
if(! generiertezahlen.get(zahl)){
generiertezahlen.set(zahl);
random[y+x] = zahl;
}
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;
}
}
}
}