为了成功生成完整的填字游戏回溯和递归,我需要更改什么以及如何更改?

问题描述

到目前为止,我已经发布了我所做的事情,并遵循以下原则,但我似乎误会了。 2-3年前,我生成填字游戏的方式是:

  1. 我有一堂课代表一个单词。它具有坐标(x,y)-起点,方向(水平,垂直)和单词本身。
  2. 我有一个单词列表,可以在算法开始之前混合使用。
  3. 我将第一个单词放在水平(0,0)上,并将其放在解决方案列表中。
  4. “我进入一个级别”(递归),我接下一个单词。
  5. 我仔细阅读了解决方案列表,然后尝试将其放置在某个位置(条件:两个单词有一个共同的字母,并且方向不同)
  6. 如果找到它,则将其添加解决方案中-如果它们有一个普通字母,则可以轻松计算起点和方向。
  7. 我检查部分解是否正确(所有相交的单词都具有相同的字母)-也许这是最复杂的。也许有助于将每个单词相交的地方保留下来。 8.1。如果确定,请继续(直到单词列表或其他条件,如填字游戏的大小完成) 8.2。如果错了,我从解决方案中删除该单词,删除一个递归级别(回溯)-例如返回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,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',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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)