• 27 Eylül 2020 23:57

Sait ORHAN

Öğretmek için Öğrenin- Öğrenmek için Öğretin

Labirent Çözme

BySait ORHAN

Eyl 11, 2011

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.

[cpp]

#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;
}

[/cpp]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.