Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提取随机填充的纵横字谜表中的所有单词_C#_Unity3d - Fatal编程技术网

C# 提取随机填充的纵横字谜表中的所有单词

C# 提取随机填充的纵横字谜表中的所有单词,c#,unity3d,C#,Unity3d,在纵横字谜表中,假设它是针对移动设备的,并且与常规纵横字谜不同,常规纵横字谜可以在8个笔直方向上查找单词,那么是否有任何标准算法可以根据字典查找所有单词 在我的表格中,只要你在屏幕上的手势是连续的(移动是连续的,并且你没有从屏幕上释放你的触摸),并且没有从上一个移动中返回一个被触摸的单词,你就可以通过在各个方向上滑动字母来构建一个单词 有一个类似的应用程序。在应用程序中,它从一开始就知道所有可能的单词,并显示隐藏的单词。如果我开始迭代所有单词,例如2个字母的单词,并与触摸过的字母进行比较,那么例

在纵横字谜表中,假设它是针对移动设备的,并且与常规纵横字谜不同,常规纵横字谜可以在8个笔直方向上查找单词,那么是否有任何标准算法可以根据字典查找所有单词

在我的表格中,只要你在屏幕上的手势是连续的(移动是连续的,并且你没有从屏幕上释放你的触摸),并且没有从上一个移动中返回一个被触摸的单词,你就可以通过在各个方向上滑动字母来构建一个单词

有一个类似的应用程序。在应用程序中,它从一开始就知道所有可能的单词,并显示隐藏的单词。如果我开始迭代所有单词,例如2个字母的单词,并与触摸过的字母进行比较,那么例如,对于5x5表格中1000个2个字母的单词列表,总迭代次数约为145k。假设我们有2个字母到15个字母的单词

为了列出所有可能的单词,首先我从第一个单元格开始(我制作了一个2d字符数组来存储字母),如果字典的第一个单词的第一个字母等于这个单元格,那么我移动到字典第一个单词的下一个字符,然后移动到数组中的下一个单元格,并针对数组中的所有字母对字典第一个单词的所有字符执行此操作。这种方法正确吗?! 在一个随机填充的字符表中,有没有有效的方法来猜测所有可能的单词


提前感谢

我个人对快速查找单词的看法是一个字符树。快速且最小的内存占用,但必须预加载(或以某种方式将其序列化预填充)

类图表树{
公共级树节点{
public bool haschilds{get{返回Children.Count>0;}
公共字典子项=新字典();
公共树节点此[char idx]{
获取{返回子项[idx];}
设置{Children[idx]=value;}
}
}
保护树根;
公共void AddChars(字符串行){
如果(Root==null)Root=new TreeNode();
var currentNode=Root;
foreach(行中的var字母){
如果(!currentNode.Children.ContainsKey(字母))
currentNode.Children.Add(字母,new TreeNode());
}
}
公共字符串验证(字符串行){
var currentNode=Root;
if(currentNode==null)返回null;
var结果=”;
foreach(行中的var字母){
currentNode=currentNode[字母];
如果(currentNode==null)中断;
结果+=字母;
}
返回结果;
}
}

如何构建“线路”取决于您。您仍然需要使用您的玩家所受的任何规则来迭代2D数组。

建议的算法听起来不错。如果有意义的话,考虑删除比较表中已经匹配的单词。另外,如果不是遍历所有相同长度的单词,而是让字典对每个序列的所有长度单词进行排序和检查,我会使用将所有单词加载到一个“字符树”中并根据它进行搜索,这可能会更有效,填字游戏是一种不同于你所描述的拼图。谢谢,我会试试这个并发送反馈
class CharTree {

    public class TreeNode {
        public bool HasChildren { get { return Children.Count > 0; } }

        public Dictionary<char, TreeNode> Children = new Dictionary<char, TreeNode>();

        public TreeNode this[char idx] {
            get { return Children[idx]; }
            set { Children[idx] = value; }
        }
    }

    protected TreeNode Root;

    public void AddChars(string line) {

        if (Root == null) Root = new TreeNode();

        var currentNode = Root;

        foreach(var letter in line) {
            if (!currentNode.Children.ContainsKey(letter))
                currentNode.Children.Add(letter, new TreeNode());
        }
    }

    public string Validate( string line ) {


        var currentNode = Root;

        if (currentNode == null) return null;

        var result = "";

        foreach ( var letter in line ) {
            currentNode = currentNode[letter];

            if (currentNode == null) break;

            result += letter;
        }

        return result;
    }
}