Labirent Çözme

Soru:

İki Boyutlu (30×30) Bir Matris kullanarak bir Labirent tanımlayınız (Labirent önceden tanımlı olabilir veya programın
çalışması esnasında (yolun olması garantili) üretilebilir.).
Kapalı nokta için 0, açık nokta için 1 kullanabilirsiniz.
Bu labirenti ekrana yazdırınız.
Labirentte çıkışı bulduran algoritmayı tasarlayınız ve kodlayınız.
Çıkış bulununca çıkışı veren yolun noktalarını (satır, sutun) şeklinde yazdırınız.


#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>

#define DUVAR 1 
#define GIDILDI 2 
#define CIKIS 3 
#define BOYUT 30

enum sonuc {false, true}; 
typedef enum sonuc sonuc;

sonuc yolbul(int *[][BOYUT],int,int); 
void labirent_uret(int *[][BOYUT], int); 
void labirent_tahtasi_uret(int *[][BOYUT]); 
void labirent_sifirla(int *[][BOYUT]); 
void dosyaya_yaz(int *[][BOYUT]); 
void rastgele_bosluklar(int *[][BOYUT]);

int main() 
{ 
 // Rastgele labirent üretme satırları başlangıcı 
 srand(time(NULL)); 
 int labirent[BOYUT][BOYUT]; 
 int giris, girisi[3]; 
 int secim; 
 // Çıkış garantili giriş noktaları 
 girisi[0] = rand()%9; 
 girisi[1] = 10+rand()%9; 
 girisi[2] = 20+rand()%9; 
 labirent_tahtasi_uret(labirent); 
 for(giris=0; giris<3; giris++) 
 labirent_uret(labirent, girisi[giris]); 
 rastgele_bosluklar(labirent); 
 printf(“Labirent olusturuldu.\n”); 
 printf(“Labirenti .txt dosyasina kaydetmek icin 1’e basiniz.\n”); 
 printf(“Kaydetmeden cozmek icin 2’e basiniz.\n\nSeciminiz: \n\n”); 
 scanf(“%d”, &secim); 
 switch(secim){ 
 case 1: dosyaya_yaz(labirent); 
 default: 
 printf(“Dosyaya kaydetmeden cozmeyi istediniz.\n\n”); }

// Rastgele labirent üretme satırları sonu

 int i,j; 
// Labirenti yazdir 
 for(i=0; i<BOYUT; i++){ 
 for(j=0; j<BOYUT; j++) 
 printf(“%d”,labirent[i][j]); 
 printf(“\n”);} 
// Çıkış olabilecek noktaları işaretle 
// Son sütundaki her 0 bir çıkış olabilir 
 for(i=0; i<BOYUT; i++){ 
 if(labirent[i][29]==0) 
 labirent[i][29] = CIKIS;} 
// Labirenti çözücüye gönder 
// İlk sütundaki her 0 bir giriştir. 
 j=0; 
 for(i=0; i<BOYUT; i++){ 
 if(labirent[i][0] == 0){ 
 if(yolbul(labirent,i,j)){ labirent_sifirla(labirent); 
 printf(“%c%c%c%c%c Yol Bulundu %c%c%c%c%c (%2d,%2d)’den Giris…\n”,223,223,223,223,223,223,223,223,223,223,i,j); system(“PAUSE”);} 
 else 
 printf(“%c%c%c%c%c Yol Tikandi %c%c%c%c%c (%2d,%2d)’den Giris…\n”,223,223,223,223,223,223,223,223,223,223,i,j); } 
 } 
 system(“PAUSE”); 
 return 0;

}

sonuc yolbul(int *labirent[][BOYUT],int i, int j) 
{ 
 if(i<0 || i>=BOYUT) 
 return false; 
 if(j<0 || j>=BOYUT) 
 return false; 
 if(labirent[i][j] == DUVAR) 
 return false; 
 if(labirent[i][j] == GIDILDI) 
 return false; 
 if(labirent[i][j]==CIKIS) 
 return true;

 labirent[i][j]=GIDILDI; 
 if(yolbul(labirent,i,j-1)) {printf(” (%2d , %2d) Asagi\n”,i,j-1); return true;} 
 else if(yolbul(labirent,i,j+1)) {printf(” (%2d , %2d) Yukari\n”,i,j+1); return true;} 
 else if(yolbul(labirent,i+1, j)) {printf(” (%2d , %2d) Sag\n”,i+1,j); return true;} 
 else if(yolbul(labirent,i-1, j)) {printf(” (%2d , %2d) Yukari\n”,i-1,j); return true;} 
 return false;

}

// Rastgele labirent üretme fonksiyonu 
void labirent_uret(int *labirent[][BOYUT], int i) 
{ 
 srand(time(NULL)); 
 int j=1; 
 int hangi_yon; 
 labirent[i][0]=0; 
 labirent[i][1]=0; 
 while(j<BOYUT){ 
 hangi_yon = rand()%3; 
 switch(hangi_yon){ 
 case 0: labirent[i][j+1]=0; 
 j++; 
 break;

 case 1: if(i<29) {labirent[i+1][j]=0; i++;} 
 break;

 case 2: if(i>0) {labirent[i-1][j]=0; i–;} 
 break; 
 } 
 } 
}

/* Dizilerde atanmayan her eleman 0 olarak atandığından 
// öncelikle tamamen duvarlardan oluşan bir alan oluşturuldu 
void labirent_tahtasi_uret(int *labirent[][BOYUT]) 
{ 
 int i,j; 
 for(i=0; i<BOYUT; i++) 
 for(j=0; j<BOYUT; j++) 
 labirent[i][j] = 1; 
}

// Her girişten sonra gidilen yerleri işaretlediğinden 
// bir sonraki girişe geçmeden önce labirent ilk haline getirildi 
void labirent_sifirla(int *labirent[][BOYUT]) 
{ 
 int i,j; 
 for(i=0; i<BOYUT; i++) 
 for(j=0; j<BOYUT; j++) 
 if(labirent[i][j]==GIDILDI) 
 labirent[i][j]=0; 
}

//Labirenti .txt dosyasına kaydetme fonksiyonu 
void dosyaya_yaz(int *labirent[][BOYUT]) 
{ 
 int i,j; 
 FILE *olusturulan_labirent; 
 olusturulan_labirent = fopen(“labirent.txt”,”a”); 
 if(olusturulan_labirent != NULL){ 
 fprintf(olusturulan_labirent,”—————————————–\n\n\n”); 
 fprintf(olusturulan_labirent,”{“); 
 for(i=0; i<BOYUT;i++){ 
 fprintf(olusturulan_labirent,”{“); 
 for(j=0; j<BOYUT; j++){ 
 if(j!=29) 
 fprintf(olusturulan_labirent,”%d,”,labirent[i][j]); 
 else 
 fprintf(olusturulan_labirent,”%d”,labirent[i][j]); 
 } 
 if(i!=29) 
 fprintf(olusturulan_labirent,”},\n”); 
 else 
 fprintf(olusturulan_labirent,”}”); 
 } 
 fprintf(olusturulan_labirent,”}\n”); 
 fprintf(olusturulan_labirent,”\n\n—————————————–\n\n\n”); 
 fclose(olusturulan_labirent); 
 } 
}

void rastgele_bosluklar(int *labirent[][BOYUT]) 
{ 
 srand(time(NULL)); 
 int i,j,giris; 
 for(giris=0; giris<5; giris++){ 
 i= rand()%29; 
 labirent[i][0]=0;} 
 for(i=1; i<BOYUT; i++) 
 for(j=1; j<BOYUT-1; j++) 
 if(labirent[i][j]==1) 
 labirent[i][j]= rand()%2; 
}

Yorum Yapın

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑

%d blogcu bunu beğendi: