h1jack3r
04-06-2005, 12:18
Ciao a tutti, mi sapete aiutare con questo problema?
Ho una mappa composta da asterischi e punti
ad esempio questa
..*...........*.....
..**...........*....
...****.........*...
.................*..
.........*..........
.........*..........
...**....*..........
.........*..........
..........*.........
...........****.....
....................
..........*.........
Voglio trovare la massima lunghezza che fanno gli asterischi adiacenti, in questo caso è 7, e poi alla fine stampare a video il pezzo di matrice contenente il percorso. Originariamente il problema era per matrici larbitrariamente lunghe, io lo sto risolvendo per quella specifica matrice per poi espanderlo al problema generico. La lunghezza non supera comunque i 20 caratteri. La matrice è in un file.
Per risolvere il problema avevo pensato ad una soluzione ricorsiva, quando trova il primo asterisco cerca nelle posizioni adiacenti se ce n'è un altro e va avanti. Solo che sono un po' niubbo con la ricorsione e trovo abbastanza difficoltà, mi dareste una mano?
Vi posto la parte di codice che ho già scritto...
Ho anche qualche dubbio sui puntatori da passare alla funzione
Ecco il programmino ovviamente ancora non funzionante
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
char **posiz;
char *trova_asterisco(char **mappa,int i, int j);
int main()
{
char mappa[20][21];
char mappa1[20];
FILE *fp;
char file[50];
int i,j;
//apertura del file
//printf("Inserire il nome del file della mappa\n");
//scanf("%s",file);
if((fp=fopen("mappa.txt","r"))==NULL){
printf("Impossibile aprire il file");
return 0;
}
//carico in memoria la matrice assumendo nota la dimensione
for(i=0;i<12;i++)
fgets(&mappa[i][0],80,fp);
for(i=0;i<12;i++){
for(j=0;j<20;j++){
printf("%c",mappa[i][j]);
}
printf("\n");
}
//trova primo asterisco
for(i=0;i<12;i++){
for(j=0;j<20;j++){
if(mappa[i][j]=='*')
{
printf("Primo asterisco in: %d, %d",i,j); //potrei salvare la posizione
//in variabili globali
//qui dovrei chiamare la procedura ricorsiva trova_asterisco
posiz=trova_asterisco(mappa,i,j);
getch();
return(0);
}
}
}
getch();
}
char *trova_asterisco(char **mappa,int i, int j)
{
if(mappa[i][j+1]=='*')
posiz=trova_asterisco(mappa,i,j);
else
if(mappa[i+1][j-1]=='*')
posiz=trova_asterisco(mappa,i,j);
else
if(mappa[i+1][j]=='*')
posiz=trova_asterisco(mappa,i,j);
else
if(mappa[i+1][j+1]=='*')
posiz=trova_asterisco(mappa,i,j);
else
return(&mappa[i][j]);
}
Ho una mappa composta da asterischi e punti
ad esempio questa
..*...........*.....
..**...........*....
...****.........*...
.................*..
.........*..........
.........*..........
...**....*..........
.........*..........
..........*.........
...........****.....
....................
..........*.........
Voglio trovare la massima lunghezza che fanno gli asterischi adiacenti, in questo caso è 7, e poi alla fine stampare a video il pezzo di matrice contenente il percorso. Originariamente il problema era per matrici larbitrariamente lunghe, io lo sto risolvendo per quella specifica matrice per poi espanderlo al problema generico. La lunghezza non supera comunque i 20 caratteri. La matrice è in un file.
Per risolvere il problema avevo pensato ad una soluzione ricorsiva, quando trova il primo asterisco cerca nelle posizioni adiacenti se ce n'è un altro e va avanti. Solo che sono un po' niubbo con la ricorsione e trovo abbastanza difficoltà, mi dareste una mano?
Vi posto la parte di codice che ho già scritto...
Ho anche qualche dubbio sui puntatori da passare alla funzione
Ecco il programmino ovviamente ancora non funzionante
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
char **posiz;
char *trova_asterisco(char **mappa,int i, int j);
int main()
{
char mappa[20][21];
char mappa1[20];
FILE *fp;
char file[50];
int i,j;
//apertura del file
//printf("Inserire il nome del file della mappa\n");
//scanf("%s",file);
if((fp=fopen("mappa.txt","r"))==NULL){
printf("Impossibile aprire il file");
return 0;
}
//carico in memoria la matrice assumendo nota la dimensione
for(i=0;i<12;i++)
fgets(&mappa[i][0],80,fp);
for(i=0;i<12;i++){
for(j=0;j<20;j++){
printf("%c",mappa[i][j]);
}
printf("\n");
}
//trova primo asterisco
for(i=0;i<12;i++){
for(j=0;j<20;j++){
if(mappa[i][j]=='*')
{
printf("Primo asterisco in: %d, %d",i,j); //potrei salvare la posizione
//in variabili globali
//qui dovrei chiamare la procedura ricorsiva trova_asterisco
posiz=trova_asterisco(mappa,i,j);
getch();
return(0);
}
}
}
getch();
}
char *trova_asterisco(char **mappa,int i, int j)
{
if(mappa[i][j+1]=='*')
posiz=trova_asterisco(mappa,i,j);
else
if(mappa[i+1][j-1]=='*')
posiz=trova_asterisco(mappa,i,j);
else
if(mappa[i+1][j]=='*')
posiz=trova_asterisco(mappa,i,j);
else
if(mappa[i+1][j+1]=='*')
posiz=trova_asterisco(mappa,i,j);
else
return(&mappa[i][j]);
}