Hallo Leute!
Ich wollte mal das Springerproblem (ein schachbrett mit einem Springer ablaufen und jedes Feld nur einmal berühren) mit PHP lösen.
Soweit so gut. Ich probiere es zur Zeit mit einem 5x5 Brett, weil es sonst zu lange dauert.
Ohne Warnsdorfregel schafft das Script 5x5 bis auf 2 Felder. Mit Warnsdorfregel, also immer zu dem Feld springen, von wo aus es die wenigsten Möglichkeiten gibt, geht überaupt nichts. Das Script bricht bei mir sofort ab und FireFox gibt nen Fehler aus, nicht PHP.
Knackpunkt ist ein: $counter++; der die Anzahl der Felder festlegt, die bei dem nächsten Feld möglich sind. Das ist ja eigentlich nicht Resourcenfressend, aber wenn ich ihn auskommentiere, läuft das script wieder.
Weiß jemand woran das liegt? Hier ein kleiner auszug mit dem $counter++;
Ich wollte mal das Springerproblem (ein schachbrett mit einem Springer ablaufen und jedes Feld nur einmal berühren) mit PHP lösen.
Soweit so gut. Ich probiere es zur Zeit mit einem 5x5 Brett, weil es sonst zu lange dauert.
Ohne Warnsdorfregel schafft das Script 5x5 bis auf 2 Felder. Mit Warnsdorfregel, also immer zu dem Feld springen, von wo aus es die wenigsten Möglichkeiten gibt, geht überaupt nichts. Das Script bricht bei mir sofort ab und FireFox gibt nen Fehler aus, nicht PHP.
Knackpunkt ist ein: $counter++; der die Anzahl der Felder festlegt, die bei dem nächsten Feld möglich sind. Das ist ja eigentlich nicht Resourcenfressend, aber wenn ich ihn auskommentiere, läuft das script wieder.
Weiß jemand woran das liegt? Hier ein kleiner auszug mit dem $counter++;
PHP-Code:
function springen($akt_x, $akt_y, $count = 1)
{
global $x_array, $y_array, $fields;
$fields[$akt_x][$akt_y] = $count;
$moegliche_felder_x = array();
$moegliche_felder_y = array();
for ($i=0;$i<=7;$i++) {
$new_x = $akt_x+$x_array[$i];
$new_y = $akt_y+$y_array[$i];
if (isset($fields[$new_x][$new_y]) AND $fields[$new_x][$new_y] == 0) {
$moegliche_felder_x[] = $akt_x+$x_array[$i];
$moegliche_felder_y[] = $akt_y+$y_array[$i];
}
}
if (count($moegliche_felder_x) == 0) {
return FALSE;
}
else {
// Sprungmöglichkeit mit den wenigsten weiteren Möglichkeiten
$moegliche_felder_weitere_anzahl = array();
for ($j=1;$j<=count($moegliche_felder_x);$j++) {
$counter = 0;
for ($i=0;$i<=7;$i++) {
$new_x = $moegliche_felder_x[$j]+$x_array[$i];
$new_y = $moegliche_felder_y[$j]+$y_array[$i];
if (isset($fields[$new_x][$new_y]) AND $fields[$new_x][$new_y] == 0) {
$counter++;
}
}
$moegliche_felder_weitere_anzahl[$j] = $counter;
}
asort($moegliche_felder_weitere_anzahl);
$moegliches_feld = array_pop($moegliche_felder_weitere_anzahl);
return springen($moegliche_felder_x[$moegliches_feld], $moegliche_felder_y[$moegliches_feld], $count+1);
}
}
Kommentar