これまでに行ったことを投稿し、以下の原則に従っていますが、間違っているようです。2〜3年前にクロスワードパズルを生成した方法は次のとおりです。
- 1つの単語を表すクラスがあります。座標 (x, y) - 開始位置、方向 (水平、垂直)、および単語自体があります。
- アルゴリズムが開始する前に必要に応じて混合する単語のリストがあります。
- 最初の単語を (0,0) に水平に置き、ソリューションのリストに入れます。
- 「I go one level inside」(再帰)、次の単語を取ります。
- 解決策のリストを調べて、どこかに配置しようとします (条件: 2 つの単語の文字が共通で、向きが異なる)
- 見つかったら、それをソリューションに追加します。共通の文字があれば、開始点と方向を簡単に計算できます。
- 部分的な解決策が正しいかどうかを確認します (交差するすべての単語が同じ文字を持っている) - おそらくこれが最も複雑です。交差するすべての単語を保持すると役立つ場合があります。8.1. 8.2. OK の場合、続行します (単語リストまたはクロスワード パズルのサイズなどのその他の条件が完了するまで)。それが間違っている場合は、ソリューションから単語を削除し、1 レベルの再帰 (バックトラッキング) を削除します。たとえば、null を返し、次の単語を試します。
誰かが私を助けたり、問題を解決するのに間違っている場所を案内してくれますか? 現在、単語を使用してクロスワード パズルを生成しています (クロスワードの矢印の種類が正しくありません)。
<?php
class Board {
private $arrBoard;
private $arrWords;
private $iCols;
private $iRows;
public function Board($nRows, $nCols) {
$this->iCols = $nCols;
$this->iRows = $nRows;
for ($col = 0; $col < $this->iCols; $col++) {
for ($row = 0; $row < $this->iRows; $row++) {
$this->arrBoard[$row][$col] = '*';
}
}
}
public function visualize() {
echo "<table border='1'>";
for ($col = 0; $col < $this->iCols; $col++) {
echo "<tr c='$col'>";
for ($row = 0; $row < $this->iRows; $row++) {
echo "<td r='$row'>" . $this->arrBoard[$row][$col] . '</td>';
}
echo "</tr>";
}
echo "</table>";
}
private function fillRubish() {
}
public function assignWordList($arrList) {
$this->arrWords = $arrList;
}
private function writeHorizontalWord($sWord) {
$arrWord = preg_split('//u', $sWord, 0, PREG_SPLIT_NO_EMPTY);
echo "Horizontal word: $sWord </br>";
$arrPos = $this->getRandPosH($sWord);
$col = $arrPos['col'];
$row = $arrPos['row'];
foreach ($arrWord as $sLetter) {
$this->arrBoard[$col][$row] = $sLetter;
$col++;
}
}
private function writeVerticalWord($sWord) {
$arrWord = preg_split('//u', $sWord, 0, PREG_SPLIT_NO_EMPTY);
echo "Vertical word: $sWord </br>";
$arrPos = $this->getRandPosV($sWord);
$col = $arrPos['col'];
$row = $arrPos['row'];
foreach ($arrWord as $sLetter) {
$this->arrBoard[$col][$row] = $sLetter;
$row++;
}
}
private function getRandPosH($sWord) {
$iWordLength = strlen($sWord);
$row = rand(0, $this->iRows-1);
$col = rand(0, ($this->iCols-$iWordLength)-1);
return array('col' => $col,'row' => $row);
}
private function getRandPosV($sWord) {
$iWordLength = strlen($sWord);
$row = rand(0, ($this->iRows-$iWordLength)-1);
$col = rand(0, $this->iCols-1);
return array('col' => $col,'row' => $row);
}
public function writeWords() {
foreach($this->arrWords as $sWord => $sArrange) {
$i++;
if ($sArrange == 'v') {
$this->writeVerticalWord($sWord);
} else if ($sArrange == 'h') {
$this->writeHorizontalWord($sWord);
}
}
}
}
$oBoard = new Board(6,6);
//$oBoard->visualize();
$arrWords = array('smart' => 'h',
'one' => 'h',
'two' => 'h',
'market' => 'h',
'zoomarket' => 'h',
'store' => 'h',
'shop' => 'h',
'everyday' => 'h',
'everyone' => 'h',
'underground' => 'h',
'business' => 'h',
'small' => 'h',
'okay' => 'h',
'big' => 'h',
'climate' => 'v',
'cocacola' => 'v',
'talk' => 'v',
'me' => 'v',
'tibel' => 'v',
'maxima' => 'v',
'dog' => 'v',
'cat' => 'v',
'frog' => 'v',
'human' => 'v',
'blue' => 'v',
'red' => 'v',
'phone' => 'v',
'telephone' => 'v',
);
$oBoard->assignWordList($arrWords);
$oBoard->writeWords();
echo '</br>================================================== </br>';
$oBoard->visualize();
出力:
s l t p r m
* e i h e a
s p b o d x
e h e n l i
o o l e k m
b n t l n a