lecture tableau 2 dimensions en spirale

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : lecture tableau 2 dimensions en spirale

Re: lecture tableau 2 dimensions en spirale

par dix2 » 11 juil. 2012, 14:15

ah bon? A priori, et a posteriori recursif <==> une condition d'arrêt.
<?PHP

function enumerer ($ligne)
{
if (count($ligne) > 0)
{
print_r($ligne);
}
}
function parcourir ($carre)
{
$dim_carre = count ($carre);
if ($dim_carre <= 1)
{
print "c'est fini";
}
else
{

$ligne_1 = array_shift($carre);
$ligne_der = array_reverse(array_pop ($carre));
$colonne_der = array();
$colonne_1 = array();
$carre_1 = array();
foreach ($carre as $ligne)
{
//print_r($ligne);
$dim = count($ligne);
$colonne_der[] = array_pop($ligne);
$colonne_1[] = array_shift($ligne);
$carre_1[] = $ligne;
}


enumerer ($ligne_1);
enumerer ($colonne_der);
enumerer ($ligne_der);
enumerer (array_reverse($colonne_1));
parcourir ($carre_1);

}
}

$carre = array(
array(0,1,2,3),
array(4,5,6,7),
array(8,9,10,11),
array(12,13,14,15));
parcourir ($carre);

?>
c'est peut-être possible avec une seule condition d'arrêt mais je pense que c'est plus simple avec 2

sinon, j'ai testé ton code et il semble qu'il ne fonctionne pas complètement avec les tableaux de dimension impaire (l'élément central n'est pas affiché)
il faut rajouter une petite rustine pour afficher à la fin l'élément central, mais du coup, autant faire 2 cas d'arrêt

Re: lecture tableau 2 dimensions en spirale

par sirakawa » 11 juil. 2012, 13:44

ah bon? A priori, et a posteriori recursif <==> une condition d'arrêt.
<?PHP

function enumerer ($ligne)
{
if (count($ligne) > 0)
{
print_r($ligne);
}
}
function parcourir ($carre)
{
$dim_carre = count ($carre);
if ($dim_carre <= 1)
{
print "c'est fini";
}
else
{

$ligne_1 = array_shift($carre);
$ligne_der = array_reverse(array_pop ($carre));
$colonne_der = array();
$colonne_1 = array();
$carre_1 = array();
foreach ($carre as $ligne)
{
//print_r($ligne);
$dim = count($ligne);
$colonne_der[] = array_pop($ligne);
$colonne_1[] = array_shift($ligne);
$carre_1[] = $ligne;
}


enumerer ($ligne_1);
enumerer ($colonne_der);
enumerer ($ligne_der);
enumerer (array_reverse($colonne_1));
parcourir ($carre_1);

}
}

$carre = array(
array(0,1,2,3),
array(4,5,6,7),
array(8,9,10,11),
array(12,13,14,15));
parcourir ($carre);

?>

Re: lecture tableau 2 dimensions en spirale

par dix2 » 11 juil. 2012, 10:21

Pour être tranquille avec l'utilisation d'une fonction récursive je traiterai manuellement le cas des carrés de 1 et de 2 de coté
tout à fait, il faut 2 conditions d'arrêt

Re: lecture tableau 2 dimensions en spirale

par Spols » 10 juil. 2012, 23:33

Le petit script que j'ai posté fonctionne parfaitement pour des valeurs paire, impaire 1 et 2 compris

Même pour 0 j'ai juste un Notice mais pas de résultat

Re: lecture tableau 2 dimensions en spirale

par Mazarini » 10 juil. 2012, 16:01

Pour être tranquille avec l'utilisation d'une fonction récursive je traiterai manuellement le cas des carrés de 1 et de 2 de coté

Re: lecture tableau 2 dimensions en spirale

par sirakawa » 09 juil. 2012, 20:47

ça sent la fonction récursive tout ça :D
on parcourt les 4 côtés et ensuite on réitère sur le sous-carré
Tout à fait d'accord, mais la condition d'arrêt est-elle la même pour les carrés pairs et pour les carrés impairs?
quelque chose du genre ?

Code : Tout sélectionner

appel: parcourir_carre (1, $dim_carre, $dim_carre); fonction parcourir_carre ($premiere, $derniere, $dim_carre) le parcours si derniere > (dim_carre -2) parcourir_carre ($premiere+1, derniere-1) sinon retour

Re: lecture tableau 2 dimensions en spirale

par Spols » 09 juil. 2012, 20:38

Merci beaucoup, le code donné fonctionne après correction de 2 petites erreurs de nom de variable, je vous le mets ci-dessous (J'ai également ajouté une petite interface pour visualiser l'exactitude du résultat
<?PHP
$tab = array();
$k = 0;
echo '<table>';
for($i=0;$i<$_GET['n'];$i++) {
	echo '<tr>';
	for($j=0;$j<$_GET['n'];$j++) {
		$tab[$i][$j] = $k;
		echo '<td>'.$k.'</td>';
		$k++;
	}
	echo '</tr>';
}
echo '</table>';
$hdebut = 0;
$hfin = $_GET['n'] - 1;
$vdebut = 0;
$vfin = $_GET['n'] - 1;
$sens = 1;
while (($hdebut <= $hfin) and ($vdebut <= $vfin)) {
   switch ($sens) {
      case 1 :
          for ($i = $hdebut;$i<=$hfin;$i++) {
               $result[] = $tab[$vdebut][$i];
          }
          $vdebut++;
          $sens = 2;
          break;
      case 2 :
          for ($i = $vdebut;$i<=$vfin;$i++) {
               $result[] = $tab[$i][$hfin];
          }
          $hfin--;
          $sens = 3;
          break;
      case 3 :
          for ($i = $hfin;$i>=$hdebut;$i--) {
               $result[] = $tab[$vfin][$i];
          }
          $vfin--;
          $sens = 4;
          break;
      case 4 :
          for ($i = $vfin;$i>=$vdebut;$i--) {
               $result[] = $tab[$i][$hdebut];
          }
          $hdebut++;
          $sens = 1;
          break;
   }
}
echo implode($result,' ');
?>

Re: lecture tableau 2 dimensions en spirale

par dix2 » 09 juil. 2012, 15:13

ça sent la fonction récursive tout ça :D
on parcourt les 4 côtés et ensuite on réitère sur le sous-carré

Re: lecture tableau 2 dimensions en spirale

par Mazarini » 09 juil. 2012, 14:58

Ca se termine avec $vdebut = $vfin = 7 et $hdebut = $hfin = 5 et $sens = 3 pour le dernier passage
Ensuite la comparaison entre $hdebut et $hfin fait sortir de la boucle

Mais je ne suis pas à l'abri d'une erreur.

Re: lecture tableau 2 dimensions en spirale

par sirakawa » 09 juil. 2012, 14:05

Et dans le cas d'un tableau 12x12 que se passe-t-til?

Re: lecture tableau 2 dimensions en spirale

par Mazarini » 09 juil. 2012, 08:57

<?PHP
$hdebut = 0;
$hfin = N;
$vdebut = 0
$vdebut = N
$sens = 1;
while (($hdebut <= $hfin) and ($vdebut <= $vfin)) {
   switch {$sens) {
      case 1 :
          for ($i = $hdebut;$i<=$hfin;$i++) {
               $result[] = $tab[$vdebut][$i]; 
          }
          $vdebut++;
          $sens = 2;
          break;
      case 2 :
          for ($i = $vdebut;$i<=$vfin;$i++) {
               $result[] = $tab[$i][$hfin]; 
          }
          $hfin--;
          $sens = 3;
          break;
      case 3 :
          for ($i = $hfin;$i>=$hdebut;$i--) {
               $result[] = $tab[$vfin][$i]; 
          }
          $vfin--;
          $sens = 4;
          break;
      case 4 :
          for ($i = $vfin;$i>=$vdebut;$i--) {
               $result[] = $tab[$i][$vfin]; 
          }
          $hdebut++;
          $sens = 1;
          break;
   }
}
var_dump($result);
?>
A tester, mais c'est l'idée : 4 sens de parcours et parcours qui se réduit d'un coté après chaque parcours.
Voir si $tab[$i]{?] ou $tab{?][$i]
Vérifier les limites de parcours

Re: lecture tableau 2 dimensions en spirale

par sirakawa » 09 juil. 2012, 08:43

Il faudrait que tu définisse la relation qui existe entre les diverses cellules que tu veux explorer
sur tes exemples:
quelle que soit la dimension du tableau
indice =1
indicateur = 1
pour indicateur variant de 1 à dimension du tableau
incrémenter l'indice
incrémenter l'indicateur
indicateur = 2
pour indicateur variant de 2 à dimension du tableau
incrémenter indicateur
indice = dimension du tableau * indicateur

et à toi de chercher pour la suite

Sinon tu peux créer des tableaux d'indices suivant la dimension des tableaux:
indices_3 = array(1,2,3,6,6...}

lecture tableau 2 dimensions en spirale

par Spols » 08 juil. 2012, 22:46

Bonjour à tous

J'ai un tableau html carré (nbre colonne = nbre ligne) mais dont la taille peut varier. Quelque soit la taille, je le construit ligne par ligne en donnant un id numéroté et incrémenté à chaque cellule.

Je voudrais pouvoir récupérer par un algorithme une liste des id en parcourant le tableau en spirale.

exemple un tableau de taille 3

Code : Tout sélectionner

0 1 2 3 4 5 6 7 8
je voudrais récupérer
0 1 2 5 8 7 6 3 4

et pour un tableau 4

Code : Tout sélectionner

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
je voudrais récupérer
0 1 2 3 7 11 15 14 13 12 8 4 5 6 10 9

Savez vous comment faire ?