Сообщение от рони
|
Попробовал сделать подобное ))) размеры поля можно менять задавая массивы HH и WW.Ваш вариант не смотрел до этого. ... :
|
Почему то ваша программа работает намного медленнее моей. Я ждал, что она выведет, например, 304 цветные картинки.
Могу показать более читабельный код такой программы, выполняющей вывод всех ходов с a1. Вместо массива клеток p[k] в ней определяются два массива положения по горизонтали и по вертикали на каждом шаге
x[k], y[k], 1<=k<=25; 0<=x[k]<=5; 0<=y[k]<=5;
Посмотрите, насколько быстрее работает.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="windows-1251" />
<script type="text/javascript">
var n = 5;
var x = new Array(); //номер вертикали на k-м шаге, 1<=k<=n*n, 1<=x[k]<=n
var y = new Array(); //номер горизонтали на k-м шаге, 1<=k<=n*n, 1<=y[k]<=n
var b = new Array("0", "a", "b", "c", "d", "e");
var r = new Array();
var u;
var dx = new Array(0, 1, 2, 2, 1, -1, -2, -2, -1, 0);
var dy = new Array(0, 2, 1, -1, -2, -2, -1, 1, 2, 0);
var s = new Array();
var str;
begining(1, 1);
function begining(vertical, horizontal)
{
u = 0;
x[1]=vertical;
y[1]=horizontal;
s[1]=0;
for (var i = 1; i<=n*n; i++) r[i]=false;
r[x[1]+n*y[1]-n] = true;
str="";
chessknight(1);
str=str+ "<br><br>Найдено "+u+" решений с a1";
document.write(str);
}
function chessknight(k)
{
if (k==n*n)
{
u++;
printing(u);
}
s[k]=0;
while(s[k]<8)
{
s[k]=s[k]+1;
if ((r[x[k]+dx[s[k]]+n*(y[k]+dy[s[k]])-n]==false)
&& (x[k]+dx[s[k]]>=1) && (x[k]+dx[s[k]]<=n)
&& (y[k]+dy[s[k]]>=1) && (y[k]+dy[s[k]]<=n))
{
r[x[k]+dx[s[k]]+n*(y[k]+dy[s[k]])-n] = true;
x[k+1] = x[k]+dx[s[k]];
y[k+1] = y[k]+dy[s[k]];
chessknight(k+1);
}
}
r[x[k]+n*y[k]-n] = false;
x[k] = 0;
y[k] = 0;
s[k] = 0;
}
function printing(u)
{
for (var i=1; i<=n*n; i++) str=str+b[x[i]]+y[i]+" ";
str = str+" = решение "+u+"<br>";
}
</script>
</body>
</html>