Cavaliers sur un échiquier

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 555 fois - Téléchargée 18 fois

Contenu du snippet

Faire passer un cavalier sur toutes les cases d'un échiquier.
.............................................................

Source / Exemple :


<HTML><HEAD><TITLE>Chevaux</TITLE><STYLE type="text/css">input{position:absolute;top:45px;left:415px;}div{position:absolute;top:100px;left:400px;}td{width:20px;height:20px;font-family:Verdana,Arial,Helvetica;font-size:12px;text-align:center;color:white}</STYLE></HEAD><BODY bgcolor="silver" onLoad="q.focus()" onKeyPress="q.focus()" onMouseUp="q.focus()">
<input type="button" value="Autre échiquier" name="q" onClick="history.go(0)" />
<SCRIPT language="JavaScript"><!--
//n minimum à 5
var n=8,a,b,x,y,xx,yy,c=new Array(n*n);
function affiche()
{
 with(document)
 {
  clear();
  var i,j;
  write("<div><table border='1px' width='"+20*n+"px' height='"+20*n+"px' cellpadding='0' cellspacing='0'>");
  for(j=0;j<n;j++)
  {
   write("<tr>");
   for(i=0;i<n;i++)
   {
    if((i+j)%2)write("<td bgcolor='black'>"+c[n*i+j]+"</td>");
    else write("<td bgcolor='white'><font color='black'>"+c[n*i+j]+"</font></td>");
   }
   write("</tr>");
  }
  write("</table></div>");
 }
}
function ok(i,j){return ((i>=0)&&(i<n)&&(j>=0)&&(j<n)&&(c[n*i+j]==0))?1:0;}
function essai(c,i,j)
{
 if((b&c)!=0)
 {
  b-=c;
  if(ok(i,j))
  {
	var k=ok(i+2,j-1)+ok(i+2,j+1)+ok(i-2,j-1)+ok(i-2,j+1)+ok(i+1,j-2)+ok(i+1,j+2)+ok(i-1,j-2)+ok(i-1,j+2);
	if(k<a)
	{
	 xx=i;
	 yy=j;
	 a=k;
	}
  }
 }
}
function choix()
{
 a=9;
 b=255;
 do
 {
  switch(Math.floor(8*Math.random()))
  {      
	case 0:essai(1,x+2,y-1);break;
	case 1:essai(2,x+2,y+1);break;
	case 2:essai(4,x-2,y-1);break;
	case 3:essai(8,x-2,y+1);break;
	case 4:essai(16,x+1,y-2);break;
	case 5:essai(32,x+1,y+2);break;
	case 6:essai(64,x-1,y-2);break;
	case 7:essai(128,x-1,y+2);break;
  }
 }
 while(b);
 return a<=8;
}
function cherche()
{
 var z;
 for(x=0;x<n;x++)for(y=0;y<n;y++)c[n*x+y]=0;
 z=x=y=0;
 xx=Math.floor(n*Math.random());
 yy=Math.floor(n*Math.random());
 do
 {
  x=xx;y=yy;
  c[n*x+y]=++z;
 }
 while(choix());
 return z<n*n;
}
function init()
{
 while(cherche());
 affiche();
}
init();
//--></SCRIPT></BODY></HTML>

A voir également

Ajouter un commentaire

Commentaires

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
réellement pas mal.
pas simple à résoudre ça "à la main".
il existe des solutions fermées ( le 65ème
coup permettrait de revenir à la case de départ )
et ouvertes ( donc dans le cas contraire )
ce ne serait pas "plus mieux" si on voyait un
cavalier se déplacer au fur et à mesure ?
@+
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
L'algorythme est intéressant, ça serait bien si tu avais de la documentation avec la source à nous faire partager. Sinon le seul détail que j'ai remarqué côté javascript, c'est que ce serait plus pratique si tu aurais utilisé un tableau à 2 dimensions au lien d'un tableau à 1 seule dimension pour la variable c.

Côté HTML, c'est pas super propre. Faut pas utiliser des tags avec des majuscules et des minuscules en même temps, c'est l'un ou l'autre. Idéalement c'est en minuscule pour rendre le tout plus lisible. La balise script doit contenir l'attribut type (recommendation w3c). Idéalement on essaie d'espacer le tout pour que ça soit plus lisible.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.