Sodoku in php

Matthias: Mitlerweile ja, war nen dämlicher Denkfehler - Aber anscheinend steh ich weiterhin auf dem Schlauch, denn anscheinend wird mein Kreuzprodukt-Array der bestehenden Werte in Spalte und Reihe nicht gefüllt...
PHP:
<?php
for ($x = 0; $x < 9; ++$x) {
    for ($y = 0; $y < 9; ++$y) {
        while (true) {
            $random = rand(1, 9);

            $cut = array();
            
            for ($i = 0; $i < $x; ++$i) {
                if (isset($cell[$x][$i])) {
                    $cut[] = $cell[$x][$i];
                }
            }
            for ($i = 0; $i < $y; ++$i) {
                if (isset($cell[$i][$y])) {
                    $cut[] = $cell[$i][$y];
                }
            }

            if (!in_array($random, $cut)) {
                break;
            }
        }
        $cell[$x][$y] = $random;
    }
}

Das lässt mir jetzt keine Ruhe :confused:
Füllt zwar die Zellen, aber es kommen doppelte Werte vor, da die Schnittmenge nicht (korrekt) berechnet wird.

------------------------------------------------------------------------------------------------------------------

Warum baue ich die zwei for eigentlich in die while? *omg*

PHP:
<?php
for ($x = 0; $x < 3; ++$x) {
    for ($y = 0; $y < 3; ++$y) {
        $cut = array();
        
        for ($i = 0; $i < $x; ++$i) {
            echo "x... ({$x};{$i})\n";
            if (isset($cell[$x][$i])) {
                $cut[] = $cell[$x][$i];
            }
        }
        for ($i = 0; $i < $y; ++$i) {
            echo "y... ({$i};{$y})\n";
            if (isset($cell[$i][$y])) {
                $cut[] = $cell[$i][$y];
            }
        }

        while (true) {
            $random = rand(1, 3);

            if (!in_array($random, $cut)) {
                break;
            }
        }
        $cell[$x][$y] = $random;
    }
}
print_r($cell);
Läuft zwar schneller, lieferte aber eben auch nur Folgendes, was falsch ist:
Code:
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => Array
        (
            [0] => 2
            [1] => 1
            [2] => 1
        )
    [2] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 2
        )
)
Gerade den totalen Denkfehler drin...


------------------------------------------------------------------------------------------------------------------

Jetzt aber... Wie gesagt, wirklich dummer Denkfehler :rolleyes:

PHP:
<?php
$cell = array();

for ($x = 0; $x < 3; ++$x) {
    for ($y = 0; $y < 3; ++$y) {
        $cut = array();
        echo "({$x};{$y})\n";
        echo "-----\n";

        // Reihe
        for ($i = 0; $i < $x; ++$i) {
            $cut[] = $cell[$i][$y];
        }

        // Spalte
        for ($i = 0; $i < $y; ++$i) {
            $cut[] = $cell[$x][$i];
        }
        print_r($cut);

        while (true) {
            $random = rand(1, 3);

            if (!in_array($random, $cut)) {
                break;
            }
        }
        $cell[$x][$y] = $random;
    }
}
print_r($cell);
 
Zuletzt bearbeitet:
Hallo,

das garantiert dir aber nicht, dass eine Lösung gefunden wird. Es kann immer noch passieren, dass du in eine „Sackgasse“ läufst. Zum Beispiel so:
Code:
[1][2][3]
[2][1][?]
[ ][ ][ ]
Bis dahin war alles okay, aber für das Feld mit dem Fragezeichen gibt es keine gültige Möglichkeit mehr. Da müsste man dann entweder mit Backtracking anrücken oder einen ganz anderen Algorithmus implementieren.

Grüße,
Matthias
 
Wieso sollte das nicht möglich sein?
Code:
1 2 3  1 2 3  1 3 2  1 3 2
2 3 1  3 1 2  2 1 3  3 2 1  …
3 1 2  2 3 1  3 2 1  2 1 3
 
Zurück