PDA

Visualizza la versione completa : [C] Scansione matrice char con ricorsione


DiegoFilippo
14-12-2016, 17:54
Si consideri un videogame dal nome “Godzilla Frenzy”. In tale gioco, il mondo è una griglia MxN e in ogni cella l'utente può costruire delle case o delle strade.
Mentre l'utente costruisce la sua città, Godzilla può arrivare improvvisamente e distruggere ciò che è stato costruito. Tuttavia, Godzilla si può muovere solo in orizzontale e in verticale e ha una paura tremenda delle strade e non vuole assolutamente attraversarle. Pertanto, Godzilla atterra su una casella scelta a caso e si può muovere solo sulle case, quando trova una strada (o il bordo della griglia) è costretto ad indietreggiare. Implementare una funzione ricorsiva che permette di calcolare, a partire da una casella di partenza (quella in cui atterra Godzilla), su quali caselle il mostro si può muovere.

la funzione deve quindi sostituire con delle g le C "racchiuse" da una cornice di S.

io ho ragionato così: dopo aver riempito la matrice in modo casuale, crea una funzione cont_mosse void di questo tipo


void cont_mosse(char mappap[][M], int coox, int cooy)
{

if (mappap[coox][cooy] = 'C')
{
mappap[coox][cooy] = 'g';

cont_mosse(mappap, coox, (cooy-1));
cont_mosse(mappap, (coox-1), cooy);
cont_mosse(mappap, (coox+1), cooy);
cont_mosse(mappap, coox, (cooy+1));


}

}

il programma però si blocca prima ancora di entrare nella ricorsione.

il codice completo è questo


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

#define N 10
#define M 15

void riempi_mappa(char mappap[][M]);
void stampa_mappa(char mappap[][M]);
void cont_mosse(char mappap[][M], int coox, int cooy);

int main()
{
srand(time(0));

int i=0;

char mappa[N][M];

riempi_mappa(mappa);
stampa_mappa(mappa);

cont_mosse(mappa, 4, 4);
printf("\n\n");
stampa_mappa(mappa);


_getch();
return 0;
}

void riempi_mappa(char mappap[][M])
{
int i=0, j=0;
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
if (rand() % 2 == 0)
mappap[i][j] = 'C';
else
mappap[i][j] = 'S';
}
}
}

void stampa_mappa(char mappap[][M])
{
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
printf(" %c ", mappap[i][j]);
}
printf("\n\n");
}
}

void cont_mosse(char mappap[][M], int coox, int cooy)
{

if (mappap[coox][cooy] = 'C')
{
mappap[coox][cooy] = 'g';

cont_mosse(mappap, coox, (cooy-1));
cont_mosse(mappap, (coox-1), cooy);
cont_mosse(mappap, (coox+1), cooy);
cont_mosse(mappap, coox, (cooy+1));


}

}

non penso di aver sbagliato ragionamento, cioè se in quella casella c'è una C controlla quella sopra, poi quella sotto, poi quella a destra e a sinistra, e faccio la stessa cosa.

MItaly
14-12-2016, 22:15
1. non stai controllando di non sforare dai bordi della matrice
2. nel primo if della cont_mosse hai scritto "=" invece di "==", per cui stai assegnando 'C' a tutte le caselle che visiti (per poi entrare nel corpo dell'if e scriverci sopra 'g').

Nota che il secondo problema viene segnalato da qualunque compilatore se abiliti i warning, cosa che ti consiglio di fare.

DiegoFilippo
14-12-2016, 22:32
l'errore era proprio nell'if che non avevo minimamente notato! Grazie mille!
Per quanto riguarda i bordi non li avevo implementati dato che non mi funzionava in nessun caso.

PS sai per caso come abilitare i warning su visual studio 2015 ?

Loading