C# 提取随机填充的纵横字谜表中的所有单词
在纵横字谜表中,假设它是针对移动设备的,并且与常规纵横字谜不同,常规纵横字谜可以在8个笔直方向上查找单词,那么是否有任何标准算法可以根据字典查找所有单词 在我的表格中,只要你在屏幕上的手势是连续的(移动是连续的,并且你没有从屏幕上释放你的触摸),并且没有从上一个移动中返回一个被触摸的单词,你就可以通过在各个方向上滑动字母来构建一个单词 有一个类似的应用程序。在应用程序中,它从一开始就知道所有可能的单词,并显示隐藏的单词。如果我开始迭代所有单词,例如2个字母的单词,并与触摸过的字母进行比较,那么例如,对于5x5表格中1000个2个字母的单词列表,总迭代次数约为145k。假设我们有2个字母到15个字母的单词 为了列出所有可能的单词,首先我从第一个单元格开始(我制作了一个2d字符数组来存储字母),如果字典的第一个单词的第一个字母等于这个单元格,那么我移动到字典第一个单词的下一个字符,然后移动到数组中的下一个单元格,并针对数组中的所有字母对字典第一个单词的所有字符执行此操作。这种方法正确吗?! 在一个随机填充的字符表中,有没有有效的方法来猜测所有可能的单词C# 提取随机填充的纵横字谜表中的所有单词,c#,unity3d,C#,Unity3d,在纵横字谜表中,假设它是针对移动设备的,并且与常规纵横字谜不同,常规纵横字谜可以在8个笔直方向上查找单词,那么是否有任何标准算法可以根据字典查找所有单词 在我的表格中,只要你在屏幕上的手势是连续的(移动是连续的,并且你没有从屏幕上释放你的触摸),并且没有从上一个移动中返回一个被触摸的单词,你就可以通过在各个方向上滑动字母来构建一个单词 有一个类似的应用程序。在应用程序中,它从一开始就知道所有可能的单词,并显示隐藏的单词。如果我开始迭代所有单词,例如2个字母的单词,并与触摸过的字母进行比较,那么例
提前感谢我个人对快速查找单词的看法是一个字符树。快速且最小的内存占用,但必须预加载(或以某种方式将其序列化预填充)
类图表树{
公共级树节点{
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;
}
}