Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RECHERCHE DE CHEMIN (RECURSIVITÉ ET BACKTRACKING)


Information sur la source

Description

Ce programme essaie de résoudre un petit problème assez simple. Un tableau est composé de MAX*MAX nombres, 0 si la case est vide, 8 s'il y a de l'eau (la ou le vaisseau ne peut passer) et 1 pour localiser le vaisseau.
Ce dernier commence en position 0,0 et doit rejoindre par tout les moyens la ligne MAX-1.
 

Source

  • #include <stdio.h>
  • #include <time.h>
  • #include <stdlib.h>
  • #define MAX 10
  • int or[MAX*MAX];
  • void remplir_tab(int tab[][MAX])
  • {
  • int i,j,temp;
  • srand(time(0));
  • for(i=0;i<MAX;i++)
  • for(j=0;j<MAX;j++)
  • {
  • temp=(int)((rand()/(double)RAND_MAX)*11);
  • if(temp<4)
  • tab[i][j]=8;
  • else
  • tab[i][j]=0;
  • }
  • tab[0][0]=1;
  • return;
  • }
  • void affiche_tab(int tab[][MAX])
  • {
  • int i, j;
  • for(i=0;i<MAX;i++)
  • {
  • for(j=0;j<MAX;j++)
  • printf("%d ",tab[i][j]);
  • printf("\n");
  • }
  • return;
  • }
  • int ok(int tab[][MAX],int x, int y)
  • {
  • if(tab[x][y]==0&&x>=0&&x<MAX&&y>=0&&y<MAX)
  • return 1;
  • else
  • return 0;
  • }
  • void coup(int tab[][MAX],int x,int y, int n) /* n= : 0 bas, 1 haut, 2 droit, 3 gauche */
  • {
  • tab[x][y]=1;
  • affiche_tab(tab);
  • printf("\n%d %d %d\n",x,y,n);
  • tab[x][y]=0;
  • getchar();
  • if(x==MAX-1)
  • exit(1);
  • else
  • {
  • if(n==0)
  • {
  • if(ok(tab,x+1,y))
  • coup(tab,x+1,y,0);
  • if(ok(tab,x,y+1))
  • coup(tab,x,y+1,2);
  • if(ok(tab,x,y-1))
  • coup(tab,x,y-1,3);
  • }
  • else if(n==1)
  • {
  • if(ok(tab,x,y+1)) /*DROIT*/
  • coup(tab,x,y+1,2);
  • if(ok(tab,x,y-1)) /*GAUCHE*/
  • coup(tab,x,y-1,3);
  • if(ok(tab,x-1,y)) /*HAUT*/
  • coup(tab,x-1,y,1);
  • }
  • else if(n==2)
  • {
  • if(ok(tab,x+1,y)) /*BAS*/
  • coup(tab,x+1,y,0);
  • if(ok(tab,x,y+1)) /*DROIT*/
  • coup(tab,x,y+1,2);
  • if(ok(tab,x-1,y)) /*HAUT*/
  • coup(tab,x-1,y,1);
  • }
  • else
  • {
  • if(ok(tab,x+1,y)) /*BAS*/
  • coup(tab,x+1,y,0);
  • if(ok(tab,x,y-1)) /*GAUCHE*/
  • coup(tab,x,y-1,3);
  • if(ok(tab,x-1,y)) /*HAUT*/
  • coup(tab,x-1,y,1);
  • }
  • }
  • }
  • int main()
  • {
  • int tab[MAX][MAX],fini=0; /* 0:case vide 8:eau 1:vaisseau */
  • remplir_tab(tab);
  • coup(tab,0,0,0);
  • return 0;
  • }
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define MAX 10

int or[MAX*MAX];

void remplir_tab(int tab[][MAX])
{
	int i,j,temp;
	srand(time(0));
	for(i=0;i<MAX;i++)
		for(j=0;j<MAX;j++)
		{
			temp=(int)((rand()/(double)RAND_MAX)*11);
			if(temp<4)
				tab[i][j]=8;
			else
				tab[i][j]=0;

			
		}
	tab[0][0]=1;
	return;
}

void affiche_tab(int tab[][MAX])
{
	int i, j;
	for(i=0;i<MAX;i++)
	{
		for(j=0;j<MAX;j++)
			printf("%d ",tab[i][j]);
		printf("\n");
	}
	return;
}

int ok(int tab[][MAX],int x, int y)
{
	if(tab[x][y]==0&&x>=0&&x<MAX&&y>=0&&y<MAX)
		return 1;
	else
		return 0;
}

void coup(int tab[][MAX],int x,int y, int n) /* n= : 0 bas, 1 haut, 2 droit, 3 gauche */
{
	tab[x][y]=1;
	affiche_tab(tab);
	printf("\n%d %d %d\n",x,y,n);
	tab[x][y]=0;
	getchar();
	if(x==MAX-1)
		exit(1);
	else
	{
		if(n==0)
		{
			if(ok(tab,x+1,y))
				coup(tab,x+1,y,0); 
			if(ok(tab,x,y+1))
				coup(tab,x,y+1,2);
			if(ok(tab,x,y-1))
				coup(tab,x,y-1,3);
		}
		else if(n==1)
		{
			if(ok(tab,x,y+1))	/*DROIT*/
				coup(tab,x,y+1,2);

			if(ok(tab,x,y-1))	/*GAUCHE*/
				coup(tab,x,y-1,3);

			if(ok(tab,x-1,y))	/*HAUT*/
				coup(tab,x-1,y,1);
		}
		else if(n==2)
		{
			if(ok(tab,x+1,y))	/*BAS*/
				coup(tab,x+1,y,0); 
			if(ok(tab,x,y+1))	/*DROIT*/
				coup(tab,x,y+1,2);
			if(ok(tab,x-1,y))	/*HAUT*/
				coup(tab,x-1,y,1);
			
		}
		else
		{
			if(ok(tab,x+1,y))	/*BAS*/
				coup(tab,x+1,y,0);
			if(ok(tab,x,y-1))	/*GAUCHE*/
				coup(tab,x,y-1,3);
			if(ok(tab,x-1,y))	/*HAUT*/
				coup(tab,x-1,y,1);
			
		}
			
	}
		

}

int main()
{
	int tab[MAX][MAX],fini=0; /* 0:case vide 8:eau 1:vaisseau */
	remplir_tab(tab);

	coup(tab,0,0,0);

	return 0;
}

Conclusion

Beignus sérieux à 1 eural !!
 

Commentaires et avis

signaler à un administrateur
Commentaire de Joky le 20/04/2006 17:28:23

Ah décidemment ;)
J'suis entrain de faire ce genre de truc ;)
Enfin vous verrez quand j'aurais fini ;)

signaler à un administrateur
Commentaire de Ziman le 20/04/2006 21:43:26

Salut,

Tu as réussi à développer quelque chose d'une manière que je n'ai pas su réaliser. J'ai été confronté à ce problème un moment et j'ai pensé à le faire avec de la récursivité et... comme je trouve que cette approche est un peu floue et bien j'ai rennoncé à cette manière qui semblait la plus logique et j'ai pensé à un autre algorithme. Il vaut ce qu'il vaut, il n'est sans doute pas meilleur que le tiens, mais je vais en donner l'idée pour ceux qui aurait comme moi, du mal avec la recursivité.

En fait, mon algorithme recopie le tableau initial dans un autre tableau (ca ce n'est pas obligatoire si dans le premier tableau il n'y a que deux choix différent : chemin libre, chemin non libre). Si ce n'est pas le cas il recopie le tableau en simplifiant de cette manière, autrement dit si l'élément est un arbre une pierre ou autre chose qui bloque le passage il met 0 sinon il met 1. On se retrouve avec un tableau binaire. Ensuite je considère que les chemins possibles partent d'un point et ne peux que descendre vers 3 des points situés en dessous (celui directement en dessous, et ceux à gauche et à droite de celui directement en dessous).

Il parcourt alors tout le tableau et pour chaque élément il regarde si au moins un des 3 éléments de passage est libre, si c'est le cas il ne fait rien, si ce n'est pas le cas il transforme l'élement en 0 car cela voudra dire que le passage est impossible par ce point. On vérifie tout les lignes sauf la dernière, ce n'est pas utile. Le parcours se fait de bas en haut.

Une fois ce passage terminé, alors il suffit de prendre un point de départ et à chaque fois on choisit un de ces points en dessous, il est alors sur et certain que si un chemin existe ce point en fera partie.

Maintenant, je n'ai pas regardé à fond ton code, donc je ne sais pas si ton algorithme est capable de remonter dans le tableau pour faire un détour à fin d'arriver au sommet. Le mien ne l'est pas ;)

signaler à un administrateur
Commentaire de manta7 le 21/04/2006 07:51:23

Salut,  j'ai  bien  compris  ce  que  tu  as  essayé  de  faire  et  ce  n'est  pas  mal  du  tout.  Quand  a  ta  question  de  savoir  si  mon  algo  est  capable  de  remonter,  je  réponds  oui,  c'esr  le  systeme  du  backtracking,  si  par  exemple  le  dernier  coup  joué  est  a  droite  il  va  tester  en  haut,  en  bas  et  a  gauche  puis  va  remonter  (c'est  a  dire  revenir  a  l'appel  de  la  fonction ) et  réaliser  un  chemin  différent. Voila  a+  ;)

signaler à un administrateur
Commentaire de Ziman le 21/04/2006 16:21:16

J'ai bine compris ce que tu veux dire, mais je ne sais pas si c'est exactement ce que je voulais dire lol, exemple :

_
|    ____
|___|    |
          |    _
          |___| |
                |

Ton algorithme pourrait il suivre ce chemin ? c'est à dire remonter pour trouver le chemin. Tu as peut etre répondu à ma question ici plus haut mais comme faut toujours tout me répeter 2 fois, je serai fixé ainsi lol

signaler à un administrateur
Commentaire de Ziman le 21/04/2006 18:13:34

Oui bon enfin mon chemin n'est pas rendu comme je l'avais fait lol

Soit fait pas attention à ma question lol

signaler à un administrateur
Commentaire de rrk275 le 09/05/2006 22:46:44

Pourquoi ne pas chercher le plus court chemin?

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Chemin d'accés [ par Juan-Marco ] Bonjour,Je ne comprend pas. Sur ce site, j'ai appris à utiliser ShellExecute mais le problème c'est au niveau du chemin ShellExecute(NULL, "op le dur chemin du debutant...? [ par zevince ] Salut,je decouvre ce site.. et ca a l'air bien cool et y'a l'air d'y avoir du passage.. ca tombe bien !moi : je connais bien html, xml, xslt et j'ai d Autre problém de variable externe [ par mateo40 ] Voila, je déclare dans projet.cpp une variable de type AnsiString chemin. Elle contient le chemin d'un fichier à ouvrir.dans Thread_Chiffrement::Execu help debutant [ par djstache ] voila j'éssaye de faire un petit pscript de cryptage/décryptage mais il ne marche pas et je sèche complètement.merci d'avance de votre aide.script:/** splitter de fichier [ par 24Karas ] salut à tousEn fait je fais un splitter de fichier mais j'ai un probleme. il me rajoute 1 octet sur la découpe et 1 octet par fichier pour la reconsti chemin d'accès [ par coockiesch ] Pourquoi lorsqu'on travaille avec les fichiers, il faut deux '/' par répertoire; par ex: c:\\winnt\\cmd.exeMerci Chemin d'un projet... [ par neub ] Salut tt le monde et bonnes fetes de fin d'anneeVoici ma question urgente (mon projet se termine en se moment):Je souhaite recuperer le chemin de mon pb avec un labyrinthe [ par skinia ] je suis sur un projet de labyrinthe et j'ai bloqué pour l' algorithme du plus court chemin (entre un pt qq du labyrinthe et la cible au milieu).le lab Récupération du chemin d'un fichier dans le 'path' [ par BettaSplendens ] Bonjour,j'ai 2 choses... d'un côté le chemin avec laquelle est lancée mon application, qui comporte "bien entendu" plusieurs répertoires.. désignons i Variable à volonté ! [ par AngeloVivaldi ] Salut.J'ai encore un problème du même type ...Je voudrai que le tableau de charactère, dans lequel l'opérateur inscrit un chemin de fichier, soit exte


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,967 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.