我正在尝试使用JavaScript动画解决拉丁方问题。
为此,我编写了下面的递归回溯算法。
通过调用search(0,0)
来启动解决问题,并且它可以正常工作,在计算后显示解决方案。但是我希望它能够展示其进展的动画,即在更改一个正方形的颜色后重新绘制整个画布。
我尝试了许多类似问题的解决方案,这些解决方案都是从stackoverflow或关于画布游戏循环的教程中找到的。但是它们都对我不起作用,因此我尽可能接近我的伪代码算法(没有任何setTimeout
或requestAnimationFrame
)提供JavaScript代码。
这里有一个工作的jsfiddle包含所有的代码。
function search(i, j){
if (latinSquare[i][j] != -1){
//this square is predefined, skip it
searchNext(i, j);
} else {
var colour = latinSquare[i][j];
while(colour < n-1){
colour = colour + 1;
latinSquare[i][j] = colour;
//redraw the whole canvas
drawLatinSquare();
//check if curent constellation is legal
var legal = true;
for (var k = 0; k < n; k++){
if (k != i){
if (latinSquare[k][j] == colour){
legal = false;
break;
}
}
if (k != j){
if (latinSquare[i][k] == colour){
legal = false;
break;
}
}
}
if (legal){
searchNext(i, j);
if (window.found) return;
}
}
latinSquare[i][j] = -1;
}
}
function searchNext(i, j){
if (i < n-1){
//proceed horizontally
search(i+1, j);
} else {
if (j < n-1){
//proceed in the next row
search(0, j+1);
} else {
//we're done
window.found = true;
}
}
}