【问题标题】:Scrabble word generator拼字游戏生成器
【发布时间】:2012-05-02 19:23:59
【问题描述】:

看了我哥哥在拼字游戏之类的 iphone 游戏中作弊后,我想知道它的算法是什么。

给定一些字母:A B C T E E

而且 SQL 表中填满了正确的单词。

我将如何创建所有字母组合以便在之后进行选择,例如: Select * from words where word IN ('A','AT',...), 只是为了从这些组合中选择正确的组合?¿

另一种可能的方式是一个 SQL 表,其中每个单词的每个字母在一列中。 但是之后系统应该验证 select 中的任何单词在给出相同的字母时都有更多的时间。

例如:

c1 c2 c3 c4 球座 我来了

这个问题只是为了满足好奇心,学习女巫算法它可能用于创建所有这些组合(带有完整和部分给定字母),然后检查它们是否存在。

谢谢!

字体:http://icon.cat/worder/wordsfinder

【问题讨论】:

标签: php sql algorithm


【解决方案1】:

要找到所有可能的有效单词,请执行以下步骤

  1. 找出所有可能的组合
  2. 找到组合中每个单词的每个排列
  3. 在数据库中搜索单词
  4. 列出单词

脚本

$tiles  = array( "A", "B", "C", "T", "E", "E") ;
$words = array();
$set = powerSet($tiles,2);

$mysql = new mysqli("localhost","root","","word");
$sql = "SELECT id from dic WHERE word = '%s'" ;

foreach ($set as $key => $value)
{
    $word = implode("", $value);
    $wordPermutation = permute($word);

    foreach($wordPermutation as $keyWord)
    {
        if(!in_array($keyWord, $words))
        {
            //if($result = $mysql->query(sprintf($sql,$keyWord)))
            //{
                //var_dump(sprintf($sql,$keyWord));
                //if($result->num_rows > 0)
                //{
                    $words[] = $keyWord ;
                //}
            //}
        }
    }
}


print_r($words);

功能

function powerSet($in, $minLength = 1, $max = 10) {
    $count = count ( $in );
    $members = pow ( 2, $count );
    $return = array ();
    for($i = 0; $i < $members; $i ++) {
        $b = sprintf ( "%0" . $count . "b", $i );
        $out = array ();
        for($j = 0; $j < $count; $j ++) {
            if ($b {$j} == '1')
                $out [] = $in [$j];
        }
        if (count ( $out ) >= $minLength && count ( $out ) <= $max) {
            $return [] = $out;
        }

    }
    return $return;
}


function permute($str) {
    if (strlen($str) < 2) {
        return array($str);
    }
    $permutations = array();
    $tail = substr($str, 1);
    foreach (permute($tail) as $permutation) {
        $length = strlen($permutation);
        for ($i = 0; $i <= $length; $i++) {
            $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
        }
    }
    return $permutations;
}

请注意我commented退出数据库验证部分,以便演示可以工作

查看演示

http://codepad.viper-7.com/oG6E6w

【讨论】:

    【解决方案2】:

    我会尝试类似的东西

    WHERE (word like '%A%' and not word like '%A%A%')
      AND (word like '%B%' and not word like '%B%B%')
    

    等等。但我相信一定有更专业的解决方案!

    【讨论】:

    • 当您多次使用同一个字母时,这将不起作用。
    • 嗯,它确实需要一个更聪明的算法,但是对于你有双倍的字母,你可以写((word like '%E%' or word like '%E%E%') and not word like '%E%E%E%')。如果我坐下来认真考虑一下,我相信我可以成功!
    • 我也想过这个问题,但是有了所有这些 AND 你只会得到最大的单词,而不是那些只使用 5 个字母中的 3 个的单词。也许使用这个,应该为每个字母组合选择一个“长度”。但是使用所有这些都不会很快。
    • 你说得对,这不是一个好的解决方案。而且它不会过滤你根本没有的字母,所以,没关系。
    【解决方案3】:

    我终于搞定了。

    如果有人对制作自我单词生成器感兴趣,我就是这样做的。

    MySQL,一个表:

    [id] , [Word]
    

    每个长度的视图:

    V1 = Select Word from TABLE where LENGTH(Word) = 1
    V2 = Select Word from TABLE where LENGTH(Word) = 2
    [...]
    

    php端:

    使用 baba 的函数,我创建了一个数组,其中:array[2] 是长度为 2 的字母的组合,以此类推。

    最后我要做的就是为每个数组选择一个视图,就像

    Select Word from V3 where Word like ('asd','dsa',....);
    

    必须有一种更快的方法,但不到一秒(本地主机)和 700K 的单词字典就成功了。

    【讨论】:

      【解决方案4】:

      实现解读的更好方法是使用字谜。因此,不要使用包含所有可能单词的库,而是使用关联数组,使用构成单词的字母作为索引。

      anagram['aer'] = ['are', 'ear', 'era']
      

      要实现这一点,请遍历所有字典单词并将每个单词推入一个数组,其中索引是按字母顺序排列的单词的字母。

      for(var i = 0; i < dictionary.length; i++) {
      //Loop through dictionary array
          var str = words[i].split('').sort().join('');
          //break apart the word and sort it alphabetically
          if(!anagram[str]) {
              //check if there is already an index with that same anagram
              anagram[str] = [];
          }
      
          anagram[str].push(words[i]);
          //Add the word to the anagram array
      
      }
      

      这种方式可以让您快速索引库,而无需经过数千种可能的排列。

      此方法在 javascript 中的示例:Word Unscrambler

      【讨论】:

        【解决方案5】:

        这是关于World fastest scrabble program的精彩文章

        您应该对离散数学(Word Automats)有所了解。希望对你有帮助:)

        【讨论】:

          猜你喜欢
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多