begin process at 2012 02 05 05:16:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > RECHERCHE DE CHEMIN (RECURSIVITÉ ET BACKTRACKING)

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 !!


 Sources du même auteur

Source avec Zip ANALYSE DES MOTS D'UN TEXTE
Source avec Zip MODIFIER LES SOUS TITRES. [LINUX]
Source avec Zip INTELLIGENCE ARTIFICIELLE AUX ÉCHECS.
** PALINDROME.CPP : RÉECRIT UN CHIFFRE OU UN TEXTE À L'ENVER...
-PROGRAMME SERVANT A CALCULER PI, TESTE SOUS VC++ ET DEVC++

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture RÉSOLUTION SUDOKU (9X9) PAR BACKTRACKING RÉCURSIF INTELLIGEN... par Gallien69
Source avec Zip BELLMAN:LA VALEUR DU PLUS COURT CHEMIN ET LE PLUS COURT CHEM... par Perace
Source avec Zip SUDOKU AVEC BACKTRACKING ET DANCING LINK par pabbati
Source avec Zip SUDUKO AVEC ALLEGRO AVEC PLUSIEURS OPTIONS :SOVLEUR ,PRORPOS... par msavyo1
CONVERTIR CHEMIN RELATIF EN CHEMIN ABSOLUE (POUR DISQUE DUR) par darkpoulpo

Commentaires et avis

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 ;)

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 ;)

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+  ;)

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

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

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,697 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales