Schach - Springerproblem (PHP überfordert)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Schach - Springerproblem (PHP überfordert)

    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++;

    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);
            }

        } 

  • #2
    was denn für einen fehler?

    Kommentar


    • #3
      Fehler: Verbindung unterbrochen

      so als ob ich offline wär... ist natürlich quatsch....

      mein apache hat genügend resourcen zur verfügung, habe alles in der ini eingestellt....

      Edit: Normalerweise kommt der Fehler bei rekursiven Funktionen die keine Abbruch bedingung haben, das ist aber hier nicht der fall...
      Zuletzt geändert von stf]Daywalker; 19.09.2006, 17:56.

      Kommentar


      • #4
        mein apache hat genügend resourcen zur verfügung, habe alles in der ini eingestellt....
        das sieht mir aber ganz und gar nicht danach aus.

        mach mal testausgaben, (bei jedem Sprung oder so) damit solltest du den Browsertimeout umgehen können.

        Kommentar


        • #5
          max_execution_time = 60000
          max_input_time = 60000
          memory_limit = 512M

          testausgaben ändern leider auch nichts daran...

          aber danke schonmal, hier geht das immer so schnell

          Edit: Achja, es ist nicht so das die execution time abläuft... Der Fehler kommt _sofort_

          Kommentar


          • #6
            testausgaben ändern leider auch nichts daran...
            sicher dass die auch an den browser gesendet werden? flush()

            Edit: Achja, es ist nicht so das die execution time abläuft... Der Fehler kommt _sofort_
            Der fehler ist ein timeout des browsers, der erstmal gar nichts mit PHP zu tun hat.

            Kommentar


            • #7
              habe flush mit reingesetzt. jetzt kommt eine ausgabe für ca 1 Sekunde...

              da lässt sich erkennen das sich die funktion viel häufiger aufruft, viel zu häufig. Maximal 25x dürfte es sein, da geht über 100x! Aber wie kann das sein das das nur an dem $counter++; liegt?

              Kommentar


              • #8
                das musst du selbst herausfinden - anscheinend veränderst du die bedingungen für die rekursion in jedem schritt und kommst da nicht mehr raus.

                Kommentar


                • #9
                  habs geschafft. [Edit: Script is Down] gibts das fertige Skript für alle die es interessiert.
                  Zuletzt geändert von stf]Daywalker; 14.11.2008, 10:12.

                  Kommentar


                  • #10
                    sagst du uns auch wo das problem lag, sowas is schließlich immer hilfreich

                    Kommentar


                    • #11
                      hätte ich, aber ich weiß es nicht...

                      ich habe einfach eine andere Abbruch Bedingung genommen, dann gings...

                      Kommentar


                      • #12
                        Hallo stf]Daywalker

                        Auch ich habe mich mal mit dem SpringerProblem beschäftigt.
                        Ich habe ein kleines PHP-Script geschrieben, welches von der WarnsdorffRegel ausgeht. Ich glaube, dein Script geht auch nach dieser Regel aus, oder?

                        Wer mal lust hast, kann sich gern mal meine Seite ansehen


                        http://www.it-soldat.de/dummy/Raetsel.108.0.html

                        Gruss

                        Christian

                        Kommentar

                        Lädt...
                        X