2016-04-03 26 views
0

T ve A'dan oluşan bir char matris verilen ev ödevi olarak işlev yapmam gerekir. Bu, söz konusu matris üzerinde bulunan adaların sayısını döndürür. İspanyolca su. Henüz yapabileceğim tek bir problem daha var, parametre olarak verdiğim matrisi değiştirebilirim. Fonksiyonumu çağırmadan ve yenisini göndermeden önce matrisi kopyalamayı düşündüm ama bunu yapamadım. Başlığın söylediği gibi, herhangi bir çeşit kütüphane işlevi (ör., Strcopy) ile kesinlikle buna ihtiyacım var. Her ihtimale karşı kodumu geçmek gerekir:Kütüphane işlevleri olmadan kopyalanan char matrix (char **)

int islands(char** map, int col, int row){ 
char** aux = map;//I don't think this line does anything 
int cont = 0; 
for (int i = 0; i < col; i++) { 
    for (int j = 0; j < row; j++) { 
     char c = aux[i][j]; 
     if (aux[i][j] =='T') { 
      cont++; 
      deleteLand(aux, i,j, col, row); 
     } 
    } 
} 
int a = cont; 
return cont; 
} 


void deleteLand(char** map, int t1,int t2, int col, int row) { 
map[t1][t2] = 'A'; 
for (int i = -1; i <= 1; i++) { 
    for (int j = -1; j <= 1; j++) { 
     if (!(i==0 && j ==0)&&(t1 + i >= 0 && t1 + i < col) && (t2 + j >= 0 && t2 + j < row)) { 
      if (map[t1 + i][t2 + j] == 'T') { 
       int tc = t1+i; 
       int tr = t2 + j; 
       deleteLand(map, tc,tr,col,row); 
      } 
     } 
    } 
} 
} 

Ve döner dair bir örnek: Girişi: ([ 'T', 'T', 'A' 'A', 'A', 'T' 'A', 'A', 'A' 'T', T ', 'A'], 3, 4) döndürür: 2

yeterince açıktır umut. Ayrıca, bunu yazarken, girişte matrisin değerini kaydedip tekrar çıkışta kaydedebileceğimi fark ettim ama sanırım pratik olarak aynı olurdu.

+0

bir matris yaygın 2B dizi eşanlamlıdır: Ben de copyStr göndeririz yüzden kütüphane işlevlerini kullanamazsınız önce belirtildiği gibi

char** copyMatrix(char ** mat, int cols) { char** newMat = new char*[cols]; for (int i = 0; i < cols; i++) { newMat[i] = copyStr(mat[i]); } return newMat; } 

Ve. "Char" gibi bir şey "char" işaretçisini gösterir. Böyle bir yapı için kullanılamaz. Bir 2D dizisine ihtiyacınız varsa, birini kullanın: int (* array2d) [COLS] '. – Olaf

+0

Bu bana sadece satırlarımdan biri vermez miydi? –

+0

@BrunoVezoli * Kesinlikle kütüphane işlevi olmadan buna ihtiyacım var * - Yani hiçbir şey kendi fonksiyon kütüphanenizi yaratmanızı engeller, yani kendi “strcpy”, vs.. Daha sonra bunları ayakkabı çekmeye çalışmak yerine büyük programda kullanabilirsiniz. "deleteLand" işlevinin tamamı bunun içinde. – PaulMcKenzie

cevap

1

Yardım için herhangi bir yardım için çok teşekkürler Bir diziyi kopyalamak için (bir diziden veri), bunun için alan ayırmanız gerekir. Kopyayı kullandıktan sonra belleği boşaltmalısınız.


Ben bu durumda veri kopyalamak tek nedeni map orijinal verileri geri yüklemek için olduğunu varsayalım. Eğer öyleyse, daha iyi bir çözüm, deleteLand'da ziyaret edilen adaları maskelemek için başka bir harf kullanmak, 'B' demek. Sonra işiniz bittikten sonra, orijinal haritayı tüm B'leri T'ye değiştirerek hızlıca geri yükleyebilirsiniz. Bellek ayırma ve tahsis etme ile ilgili tüm sorunları önler.

EDIT: Bu arada C++ etiketinin kaldırılmasından bu yana C++ içindeki asıl kodu kaldırmam gerekiyordu.

+0

Bu 'B' ye geçmenin, buradaki tüm problemleri çözmenin en iyi yoludur. Yöntemimi @PaulMcKenzie'nin önerileriyle oluşturmayı yeni bitirdim. Çok teşekkürler Paul Ben sadece –

+0

durumda benim çözüm göndereceğiz Soru bu yazıyı yazarken C++ olarak etiketlendi C. – Olaf

+0

@Olaf olarak etiketlendi. Düzenlemeli miyim? – ptrj

0

Bir yorumda paylaştığım gibi, PaulMcKenie'nin yardımıyla sorunu çözebilirim, kodu herkes için yararlı olması durumunda gönderirim.

char* copyStr(char* string) { 
char* copia = new char[strLen(string)]; 
int i = 0; 
while (*string) { 
    copia[i] = *string; 
    *string++; 
    i++; 
} 
copia[i] = *string; 
return copia; 
}