寻找完美的英语庞格拉姆算法

时间:2015-10-02 22:31:33

标签: algorithm dynamic-programming

恶作剧的想法让我想到了找到完美英语庞然达的方法。我计划使用动态编程技术编写一个程序来尝试确定可能完美的pangrams,除非其他人知道已经存在的那个,或者能够为我提供一个已知的解决方案。

我打算做的恶作剧是把同事键盘上的按键排成一个有意义的pangram,但为了做到这一点,角色只能出现一次。

作为一名程序员,我认为这是一个有趣的问题,在做了一些谷歌搜索之后,我还没有找到一个没有重复字符的pangram。

由于英语元音数量有限,我预计这可能是不可能的。如果不是不可能的话,我很好奇是否有一个可以创造的句子是有意义的。

3 个答案:

答案 0 :(得分:1)

这是一个很好的问题!如果我是你,我会以这种方式解决问题:

  • 找到一个英文字典,其中每个单词的演讲部分是什么。丢弃带有重复字符的所有单词。

  • 查找/创建英语句子的语法。它可能是这样的:S -> NP VP, NP → Pronoun | Proper-Noun | ... reference

  • 使用语法
  • 开始使用回溯程序构建句子

鉴于你不希望句子中有重复的字符,你的回溯过程不会探索深层节点,你几乎可以肯定它会相当快。

答案 1 :(得分:1)

我知道这有点旧,但在尝试解决同样的问题时,我遇到过这篇文章。

基本上,我将问题建模为图形,并使用A *搜索。图中的每个节点表示尚未选择的字母数,每个边表示选择一个可能位于完美pangram中的单词。

我用于A *的启发式是辅音与元音比率的组合,以及字母在单词中的使用频率。

我的解决方案是JavaScript中的开源,并有更详细的解释:

https://github.com/teb311/perfect-pangram-finder

答案 2 :(得分:-1)

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void main()
{

    char str[1000];
    int a[26]={0},count=0,i,n;
    for(i=0;i<1000;i++)
    {
        scanf("%c",&str[i]);
        if(str[i]=='\n')
        break;
        else if(str[i]<=90&&str[i]>=65)
        {

            n=str[i]-'A';
            if(a[n]!=1)
            {
                a[n]++;
                count++;
            }
        }
        else if(str[i]<=122&&str[i]>=97)
        {

            n=str[i]-'a';
            if(a[n]!=1)
            {
                a[n]++;
                count++;
            }
        }
        if(count==26)
        {
            printf("pangram");
            exit(0);
        }
    }
    printf("not pangram");
}