javascript でラテン方陣問題の解決策をアニメーション化しようとしています。
そのために、再帰的なバックトラッキング アルゴリズムを以下に記述しました。
問題の解決は呼び出しによって開始され、問題search(0,0)
なく機能し、計算後に解決策が表示されます。しかし、1つの正方形の色を変更した後、キャンバス全体を再描画するという点で、進行状況をアニメーションで表示したいと考えています。
私は、stackoverflow やキャンバス ゲームループに関するチュートリアルで見つかった、同様の問題に対する解決策の多くを取り入れようとしました。どちらもうまくいかなかったので、疑似コードアルゴリズムにできるだけ近いJavaScriptコードを提示しています(setTimeout
「」またはrequestAnimationFrame
「」なし)
これは、すべてのコードを含む 動作中の 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;
}
}
}