Remplir un tableau en spirale

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 397 fois - Téléchargée 16 fois

Contenu du snippet

Suite à un post (http://www.javascriptfr.com/infomsg_TABLEAU-SPIRALE_1039112.aspx ), je me suis penché sur la question du remplissage d'un tableau en spirale :
Imaginons donc un carré de 5*5, cela devrait donner ceci en résultat finale
0 1 2 3 4
15 16 17 18 5
14 23 24 19 6
13 22 21 20 7
12 11 10 9 8

Source / Exemple :


<script language="javascript"> 
<!--
tableauspirale(5);
function tableauspirale(vartaille){
	if (vartaille>1){
		var taille=parseInt(vartaille);       
		var nbr=0;
		var damier=new Array(taille);
		var nbrcarre = parseInt(taille / 2);
		//initialisation du damier
		for (var j=0;j<damier.length;j++){damier[j]= new Array(damier.length);}
		for (var j=0;j<damier.length;j++)
			{
			for (var x=0;x<damier[j].length;x++){damier[j][x]=0;}
			}
		//initialisation des limites
		var premiereligne=0;
		var dernierecolonne=taille -1 ;
		var derniereligne=taille - 1;
		var premierecolonne=0;
		for(var startcarre=1;startcarre<nbrcarre+1;startcarre++){
			//construction de la première ligne
			for(var j=premiereligne;j<dernierecolonne;j++)
				{
				damier[premiereligne][j]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//construction de la dernière colonne
			for(var j=premiereligne;j<derniereligne;j++)
				{
				damier[j][dernierecolonne]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//construction de la dernière ligne
			for(var j=dernierecolonne;j>premierecolonne;j--)
				{
				damier[derniereligne][j]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//construction de la première colonne
			for(var j=derniereligne;j>premiereligne;j--)
				{
				damier[j][premierecolonne]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//incrementation pour donner les limites du carre suivant
			premiereligne += 1;
			dernierecolonne -= 1;
			derniereligne -= 1;
			premierecolonne += 1;
		}
		//si la taille du carré est un nombre impaire alors on remplit le centre du tableau avec la dernière valeur de nbr
		if (taille%2){
			damier[premiereligne][premiereligne]=nbr;
			//affichage
			affichagetableau(damier);
		}
		
	}
}
function affichagetableau(damier){
	//affichage
	document.write("<table>");
	for (var j=0;j<damier.length;j++){
		document.write("<tr>");
		for (var x=0;x<damier[j].length;x++){
			document.write("<td>");
			document.write(damier[j][x]);
			document.write("</td>");
			}
		document.write("</tr>");
		}
	document.write("</table>");
	document.write("<br>");
}
//-->
</script>

Conclusion :


Code à placer dans le body.
J'ai placé la fonction d'affichage du tableau tout au long du procédé pour que vous puissiez voir les différentes étapes de construction !
Attention évitez les grandes tailles de carré si vous laissez l'affichage actif.

A voir également

Ajouter un commentaire

Commentaires

c_raf
Messages postés
72
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
2 juin 2009
-
Je viens de regarder tout ton code javascript et j'aimerai que tu m'explique les premières lignes

if (vartaille>1){
var taille=parseInt(vartaille);
var nbr=0;
var damier=new Array(taille);
var nbrcarre = parseInt(taille / 2);


et aussi cette partie de code:

if (taille%2){
damier[premiereligne][premiereligne]=nbr;
//affichage
affichagetableau(damier);
}


Je te remercie beaucoup nickadele
nickadele
Messages postés
1253
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013
-
Bonjour,

si la taille du carré est supérieure à 1
if (vartaille>1){
je m'assure d'avoir une valeur entière, pour bien faire il faudrait également tester qu'il ne s'agit pas d'une chaine de caractère ou d'une valeur undifined
var taille=parseInt(vartaille);
var nbr=0;
var damier=new Array(taille);
Calcul le nombre de carré qu'il y a dans mon carré initiale en fonction de la taille
ex : si j'ai un carré de taille 4 il contient 2 carrés (4/2)
var nbrcarre = parseInt(taille / 2);
...........
il s'agit du calcul du modulo (reste d'une division) si taille vaut 5, la division de 5 par 2 donne comme reste 1 (5%2)=1. J'ai fait ce test car si tu regardes le remplissage du carré avec une taille impaire tu t'apercevras qu'il reste un carré de 1 sur 1 (le centre) en fin de remplissage. Il faut donc le remplir avec la dernière valeur.
if (taille%2){
damier[premiereligne][premiereligne]=nbr;
//affichage
affichagetableau(damier);
}
c_raf
Messages postés
72
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
2 juin 2009
-
Merci nickadele pour le post que tu as mis sur le site, je l'ai regardé et j'ai mieux compris et sa ma permis d'optimiser mon code et j'en arrive a un code similaire au tiens. En fait je me prenait trop la tête avec les lignes et colonnes mais la j'ai mieux compris et j'ai bien commenté mon code afin de le refaire correctement à tout moment.

Et tu avais raison pour les compteurs, maintenant j'en utilise plus que un seul.


Franchement merci à toi d'avoir pris sur ton temps pour m'aider à faire ce tableau spirale et franchement c'est vraiment gentil de ta part de m'avoir accordé cette aide précieuse nickadele.


MERCI MERCI MERCI

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.