Hi Forum.
Gegeben ist z.b ein Feld 5x5 und die Startposition meines Springers.
Das Problem ist nun das jedes Feld nur einmal besucht werden darf.
Ich habe das ganze nun rekursiv umgesetzt.
Doch schmeißt er mit in Zeile 29,123 ein Array Out of bounds(egal welche Feldgröße und Position)
Ich wäre sehr dankbar über jede Hilfe : )
Gegeben ist z.b ein Feld 5x5 und die Startposition meines Springers.
Das Problem ist nun das jedes Feld nur einmal besucht werden darf.
Ich habe das ganze nun rekursiv umgesetzt.
Doch schmeißt er mit in Zeile 29,123 ein Array Out of bounds(egal welche Feldgröße und Position)
Ich wäre sehr dankbar über jede Hilfe : )
Java:
/****************************** Springer.java *******************************/
import AlgoTools.IO;
/**
XyZman
*/
public class Springer {
/**
* Loest das Springer-Problem, indem alle Zugmoeglichkeiten
* durchgegangen werden und nach Setzen des Springers die Methode
* rekursiv mit der naechsten Zugnummer und der neuen Position
* wieder aufgerufen wird.
*
* @param a
* @param n
* @param zeile
* @param spalte
*
* @return true, falls Springer-Problem loesbar
*/
private static boolean springe(int[][]a, int n, int zeile, int spalte){
//Loesung gefunden, wenn Zugnummer groesser als Anzahl der Felder
if (!(n<=a.length*a.length)){
return true;
}
//rekursiv die acht Zugmoeglichkeiten durchspielen
[B] if (a[zeile+1][spalte+2]==0 && zeile+1<=a.length-1 &&
zeile+1>=0 && spalte+2<=a.length-1 && spalte+2>=0)[/B]{
springe(a, n++, zeile+1, spalte+2);
a[zeile+1][spalte+2] = n;
}
else if (a[zeile+2][spalte+1]==0 && zeile+2<=a.length-1 &&
zeile+2>=0 && spalte+1<=a.length-1 && spalte+1>=0){
springe(a, n++, zeile+2, spalte+1);
a[zeile+2][spalte+1] = n;
}
else if (a[zeile+2][spalte-1]==0 && zeile+2<=a.length-1 &&
zeile+2>=0 && spalte-1<=a.length-1 && spalte-1>=0){
springe(a, n++, zeile+2, spalte-1);
a[zeile+2][spalte-1] = n;
}
else if (a[zeile+1][spalte-2]==0 && zeile+1<=a.length-1 &&
zeile+1>=0 && spalte-2<=a.length-1 && spalte-2>=0){
springe(a, n++, zeile+1, spalte-2);
a[zeile+1][spalte-2] = n;
}
else if (a[zeile-1][spalte-2]==0 && zeile-1<=a.length-1 &&
zeile-1>=0 && spalte-2<=a.length-1 && spalte-2>=0){
springe(a, n++, zeile-1, spalte-2);
a[zeile-1][spalte-2] = n;
}
else if (a[zeile-2][spalte-1]==0 && zeile-2<=a.length-1 &&
zeile-2>=0 && spalte-1<=a.length-1 && spalte-1>=0){
springe(a, n++, zeile-2, spalte-1);
a[zeile-2][spalte-1] = n;
}
else if (a[zeile-2][spalte+1]==0 && zeile-2<=a.length-1 &&
zeile-2>=0 && spalte+1<=a.length-1 && spalte+1>=0){
springe(a, n++, zeile-2, spalte+1);
a[zeile-2][spalte+1] = n;
}
else if (a[zeile-1][spalte+2]==0 && zeile-1<=a.length-1 &&
zeile-1>=0 && spalte+2<=a.length-1 && spalte+2>=0){
springe(a, n++, zeile-1, spalte+2);
a[zeile-1][spalte+2] = n;
}
return false;
}
private static void druckeSchachSpiel(int[][]a){
for (int j=0; j<a.length; j++){
IO.print("+");
IO.print("-");
}
IO.println("+");
for (int i=0; i<a.length; i++){
for (int j=0; j<a[i].length; j++){
IO.print("|");
IO.print(a[i][j]);
}
IO.print("|");
for (int j=0; j<a[i].length; j++){
IO.print("+");
IO.print("-");
}
IO.print("+");
}
}
public static void main(String[] argv) {
//Feldgroesse z einlesen
int z;
do{
z = IO.readInt("Feldergroesse(>=5):");
} while(z<5);
//Schach-Spiel der Groesse zxz
int[][]a = new int[z][z];
//Startposition des Springers festlegen
int zeile, spalte;
IO.print("Startposition des Springers");
IO.println();
do{
zeile = IO.readInt("Zeile(zwischen 0 und "+(z-1)+"):");
} while(zeile>z-1 || zeile<0);
do{
spalte = IO.readInt("Spalte(zwischen 0 und "+(z-1)+"):");
} while(spalte>z-1 || spalte<0);
//Zugnummer
int n = 1;
a[zeile][spalte] = n;
//Wahrheitswert aus springe zeigt, ob loesbar
[B] if (springe(a, n, zeile, spalte)==true)[/B]{
IO.print("Springer-Problem ist loesbar");
druckeSchachSpiel(a);
}
}
}
Zuletzt bearbeitet: