Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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
Javascript Crossoword Visualizer带方向的宽度优先搜索_Javascript_Algorithm_Breadth First Search_Visualizer - Fatal编程技术网

Javascript Crossoword Visualizer带方向的宽度优先搜索

Javascript Crossoword Visualizer带方向的宽度优先搜索,javascript,algorithm,breadth-first-search,visualizer,Javascript,Algorithm,Breadth First Search,Visualizer,我目前正在做我的一个小项目,一个纵横填字游戏解决方案 给定64个字符的输入,算法会在8x8板上显示这些字符,然后继续查看是否有匹配的单词 到目前为止,我已经为每个单词编写了一个算法,该算法通过电路板上的字母循环,并检查它们是否与单词的第一个字符相等。如果是这样的话,我调用一个helper函数,它返回当前字符的所有邻域,并继续检查这些邻域中是否有任何一个与单词的第二个字符相等,以此类推。。。。因此,基本上它是一种广度优先搜索算法,使用队列并将邻居推到该队列:) 到目前为止,这是完美的,但是我现在意

我目前正在做我的一个小项目,一个纵横填字游戏解决方案

给定64个字符的输入,算法会在8x8板上显示这些字符,然后继续查看是否有匹配的单词

到目前为止,我已经为每个单词编写了一个算法,该算法通过电路板上的字母循环,并检查它们是否与单词的第一个字符相等。如果是这样的话,我调用一个helper函数,它返回当前字符的所有邻域,并继续检查这些邻域中是否有任何一个与单词的第二个字符相等,以此类推。。。。因此,基本上它是一种广度优先搜索算法,使用队列并将邻居推到该队列:)

到目前为止,这是完美的,但是我现在意识到,一旦算法匹配了单词的第二个字符,helper函数应该只返回具有相同方向的邻居

例如,如果我的板看起来像这样:

Y A T
C E V
B X S
我需要寻找“是”这个词,算法在[0][0]处得到一个匹配,并得到所有的neightbours(在本例中是a,C,E)。然后,它检查其中是否有与单词的第二个字符匹配的字符(这里是E)。但是现在算法应该看到单词以对角方式跟随,并且只返回对角邻居(这里是S)

您知道有什么优雅的方法可以将这些信息传递给helper函数,而不必编写数千条if语句吗

为了更好地理解,以下是我迄今为止编写的代码:

当然,如果您有任何其他建议,我可以更精简/更有效地编写算法,我愿意接受所有反馈


感谢您的帮助,非常感谢:)

我不会为此选择BFS算法,因为您已经知道要查找的单词的长度。当您需要在备选方案中找到最短路径时,您会选择BFS,但在这里,从给定的起点(北、南、东、西)只有4个可能的备选方案,并且它们的长度都相等。在这种情况下,实际上不需要图形搜索算法

所以我会改变你的
字谜解算器的内部部分,在4个可能的方向上使用一个循环,每一个方向,只需在该方向上立即扫描到单词的长度

下面是它的外观:

function crosswordSolver(words, grid) {
  let directions = [[-1, 0], [0, -1], [1, 0], [0, 1]];
  for (word of words) {
    let found = false;
    for (let i = 0; i < 8 && !found; i++) { // <-- extra exit condition
      for (let j = 0; j < 8 && !found; j++) { // <-- ... also here.
        if (grid[i][j] == word[0]) { // Simple check for 1st char
          for (let [dx, dy] of directions) { // Four directions to scan.
            found = true;
            for (let k = 0, x = i, y = j; k < word.length; k++, x+=dx, y+=dy) {
              if (x < 0 || y < 0 || x > 7 || y > 7 || word[k] !== grid[x][y]) {
                found = false; // Out of bounds, or mismatch
                break;
              }
            }
            if (found) break;
          }
        }
      }
    }
    if (found) checked.push(word);
  }
  console.log(checked);
}
函数纵横字谜解算器(字、网格){
设方向=[-1,0],[0,-1],[1,0],[0,1];
为了(逐字逐句){
让发现=错误;
for(设i=0;i<8&&!found;i++){//7 | | word[k]!==grid[x][y]){
found=false;//超出范围或不匹配
打破
}
}
如果(发现)断裂;
}
}
}
}
如果(找到)已选中,则按(word);
}
控制台日志(选中);
}

我试用了你的版本,但似乎不起作用。作为输入,我创建了一个字符串,这个字符串曾经在黑板上垂直排列,拼写为YES,但它没有检查单词。它只在水平方向工作,而不是垂直方向