gpt4 book ai didi

javascript - 用回溯法解决 Knight's Tour (javascript)

转载 作者:行者123 更新时间:2023-11-29 15:03:24 36 4
gpt4 key购买 nike

我正在尝试用 javascript 编写一个算法来使用回溯法解决 Knight's Tour 问题,但它不起作用。基本上,该函数应该输出一个名为 visited 的数组,其中包含每个移动的位置。但是,没有位置附加到数组,它仍然是 [[0,0]]。这是我的代码。有什么线索吗?

var unit = 75;

function m1(position) { position[0] += unit; position[1] += 2*unit; return [position[0],position[1]]}
function m2(position) { position[0] -= unit; position[1] += 2*unit; return [position[0],position[1]]}
function m3(position) { position[0] += 2*unit; position[1] += unit; return [position[0],position[1]]}
function m4(position) { position[0] -= 2*unit; position[1] += unit; return [position[0],position[1]]}
function m5(position) { position[0] += unit; position[1] -= 2*unit; return [position[0],position[1]]}
function m6(position) { position[0] -= unit; position[1] -= 2*unit; return [position[0],position[1]]}
function m7(position) { position[0] += 2*unit; position[1] -= unit; return [position[0],position[1]]}
function m8(position) { position[0] -= 2*unit; position[1] -= unit; return [position[0],position[1]]}

var moves = [m1, m2, m3, m4, m5, m6, m7, m8];
var currentPosition = [0, 0];
var visited = [currentPosition];

function knightour(currentPosition)
{

var j;

if (promising(currentPosition))
{

if (visited.length == 64)
{
return visited;
}
else
{
for (j=0; j<moves.length; j++)
{
context.drawImage(knight, currentPosition[0], currentPosition[1]);
alert("NEXT");
visited.push(moves[j](currentPosition));
knightour(currentPosition);
}
}
}
}

function promising(currentPosition)
{
if (currentPosition[0] < 600 && currentPosition[0] >= 0 &&
currentPosition[1] < 600 && currentPosition[1] >= 0 &&
isVisited(currentPosition, visited))
{
return true;
} else {
return false;
}

}

function isVisited(position, visited) // visited is an array of size n of array of size 2 ([x,y])
{ // currentPosition is an array of size 2 ([x,y])
for (var i=0; i<visited.length; i++)
{
if (position[0] == visited[i][0] && position[1] == visited[i][1])
{
return true;
}
}
return false;

}

谢谢。

最佳答案

您必须后退一步:您甚至还没有整理出回溯算法,并且您已经将您显示的棋盘与算法所需的棋盘混为一谈。最好的办法是重新开始,解决算法,然后担心这一切的显示。有了这个想法,您应该先用伪代码解决算法,然后将该伪代码转换为 JavaScript。 (提示:在您的代码中,您似乎永远不会更改当前位置。)

我看到的整体流程是这样的:

findAllKnightsTours:
for every board position
set path = empty
set board = all false
findKnightsTour(currentPosition, path, board)

将路径作为堆栈非常棒。每次搜索它以查看是否访问过一个广场是一种痛苦,所以我会使用一个单独的“板”。该板应该是一个 bool 值矩阵(false==未访问,true=已访问),尽管为简单起见,我将使用一个简单的数组。

findKnightsTour(position, path, board):
push position onto path
set board[position] to true

if path.length == 64
print out path
else
for each of the eight moves
next = calculate new position based on move
if validPosition(next, board)
findKnightsTour(next, path, board)

set board[position] to false
pop position off path

validPosition 例程检查该位置是否在棋盘限制内并且当前未被访问(即 true)。

如果您查看此例程,您会发现它将当前位置添加到路径和板上,执行操作,然后将其从路径和板上删除。这是算法的回溯部分:保存一些状态,尝试一些东西,然后恢复旧状态。

我将 JavaScript 转换留给读者作为一个简单的练习。

关于javascript - 用回溯法解决 Knight's Tour (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486913/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com