Newsgroup: it.comp.lang.c
Titolo: Cerco urgentemente aiuto

Ciao a tutti,
Sono disperato e cerco urgentemente aiuto !!!
Devo adattare il codice (1) scritto in C ,che ho già fatto in classe, al
problema in fondo (n°2).
Conto su qualche persona gentile e di buon cuore a cui sono disspoto a
offrire una buona bottiglia di vino del Collio :-)
Tengo a sottolineare l’urgenza del caso altrimenti mi scotennano.
Grazie
CODICE (1)
//----------------------------------------------------------
//
// programma play
//
//----------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#define true 1
#define false 0
#define STAMPAPASSI
typedef int bool;
void initMatrice(int m[10][10]);
void stampaMatrice(int m[10][10]);
/* m[10][10] è il parametro che passo ovvero una matrice
di 10x10 elementi */
bool convalida ( int riga, int colonna, int m[10][10] );
bool vinto(int m[10][10]);
bool muovi(int riga, int colonna, int matrice[10][10], int numero);
=========================================================
void main(void)
{
char x;
int matrice[10][10];
initMatrice(matrice);
if (muovi(0,0,matrice,0) == true) {
printf("Hoi ho finito il giochetto");
}
stampaMatrice(matrice);
x = getch();
}
//----------------------------------------------------------
// inizializzazione della matrice per il gioco
//----------------------------------------------------------
void initMatrice(int m[10][10])
{
int i;
int j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
m[i][j] = 0;
}
}
}
//----------------------------------------------------------
// stampa della matrice per il gioco
//----------------------------------------------------------
void stampaMatrice(int m[10][10])
{
int i;
int j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%4d",m[i][j]);
}
printf("\n\n");
}
}
//----------------------------------------------------------
// convalida le coordinate
//----------------------------------------------------------
bool convalida(int riga,int colonna,int m[10][10])
{
if( riga < 0 || riga > 9 || colonna < 0 || colonna > 9)
{
return false;
}
if (m[riga][colonna] != 0)
{
return false;
}
return true;
}
/* La funzione ricorsiva di scelta della prossima mossa
parametri:
1. posizione sulla riga,
2. posizione sulla colonna (posizione della funzione ricorsiva)
3. puntatore alla matrice (campo di gioco)
4. il numero della mossa che facciamo
valore di ritorno
True: la funzione è arrivata a 100
False: la funzione non è in grado di fare una mossa
*/
bool muovi(int riga, int colonna, int matrice[10][10], int numero)
{
// prima di tutto vediamo se il posto dove mi hanno mandato è una
// posizione all'interno del campo di gioco ed è libera
if (convalida(riga, colonna, matrice) == false) return false;
// definisco quale numero di ricorsiva sono
numero++;
// scrivo sulla matrice la mia posizione
matrice[riga][colonna] = numero;
#ifdef STAMPAPASSI
stampaMatrice(matrice);
#endif
// se sono la ricorsiva numero 100 abbiamo posizionato tutte
// le mosse correttamente, fine del gioco
if (numero == 100) return true;
//proviamo a vedere se ci possiamo spostare verso nord
if (muovi(riga-3,colonna, matrice, numero) == true){
//fine del gioco siamo arrivati a 100
return true;
}
// se arriviamo qui lo spostamento verso nord è andato male
// proviamo a nordest
if (muovi(riga-2, colonna+2, matrice, numero) == true){
return true;
}
// proviamo a est
if (muovi(riga, colonna+3, matrice, numero) == true){
return true;
}
// proviamo a sudest
if (muovi(riga+2, colonna+2, matrice, numero) == true){
return true;
}
// proviamo a sud
if (muovi(riga+3, colonna, matrice, numero) == true){
return true;
}
// proviamo a sudovest
if (muovi(riga+2, colonna-2, matrice, numero) == true){
return true;
}
// proviamo a ovest
if (muovi(riga, colonna-3, matrice, numero) == true){
return true;
}
// proviamo a nordovest
if (muovi(riga-2, colonna-2, matrice, numero) == true){
return true;
}
/* alla fine se nessuna delle nuove mosse è valida la soluzione
// non è possibile per qusta strada, lascio alla funzione che mi
// ha chiamato di tentare un altra direzione cardinale ed intanto
// pulisco la matrice dal mio numero che non va bene messo la.
*/
matrice[riga][colonna] = 0;
return false;
}
PROBLEMA N° 2
data la matrice di char 10x10:
| 0123456789
-+-----------
0| 000000*000
1| *****0***0
2| ***0***0**
3| *00000*000
4| 00******0*
5| 0****0000*
6| 000000***0
7| ***0***000
8| 00*00*000*
9| ****000*00
partendo dalla posizione 0,0 si trova il modo di raggiungere 10,10
passando solo sugli '0' e considerando gli '*' come ostacoli
insormontabili.

Ciao,
    mi sono sempre piaciuti gli esercizi tipo quello che ti hanno assegnato... qui di seguito
c'e' la soluzione, che ho fatto ex-novo, senza riadattare la tua. Spero possa andare,
e' la migliore che mi e' venuta in mente...
Saluti,
    Alessandro
//inizio codice
#include <stdio.h>
typedef enum {FALSE, TRUE} Boolean;
char matrice[10][10]={
{'0','0','0','0','*','*','*','*','*','*'},
{'0','0','*','*','*','*','*','*','*','*'},
{'0','*','*','*','*','*','*','*','*','*'},
{'*','0','0','0','*','*','*','*','*','*'},
{'*','*','*','*','0','0','*','0','*','*'},
{'*','*','*','0','*','*','*','*','*','*'},
{'0','*','*','*','0','0','*','*','*','*'},
{'*','*','*','*','*','0','*','*','*','*'},
{'0','*','*','*','*','*','0','*','*','*'},
{'0','0','0','0','0','0','0','0','0','0'}};
int mossa[10][10];
Boolean sipuoproseguire[10][10];
void InizMosse();
Boolean Muovi(int px,int py, int n);
Boolean Valida(int px,int py);
void StampaSoluzione();
void main()
{
InizMosse();
if(Muovi(0,0,1))
    StampaSoluzione();
else
    printf("Non e' possibile trovare un percorso\n");
system("PAUSE");
}
void InizMosse()
{
int i,j;
for(i=0;i<10;i++){
    for(j=0;j<10;j++){
        mossa[i][j]=0;
        sipuoproseguire[i][j]=TRUE;
        }
   }
}
Boolean Valida(int px,int py)
{
if(px<0 || px>9 || py<0 || py>9) return(FALSE);
if(matrice[px][py]=='*') return(FALSE);
if(mossa[px][py]!=0) return(FALSE);
return(sipuoproseguire[px][py]);
}
Boolean Muovi(int px,int py, int n)
{
int i,j;
mossa[px][py]=n;
if(px==9 && py==9) return(TRUE);
for(i=1;i>=-1;i--){
    for(j=1;j>=-1;j--){
        if(!(i==0 && j==0) && Valida(px+i,py+j))
                if(Muovi(px+i,py+j,n+1))
                    return(TRUE);
  }
 }
sipuoproseguire[px][py]=FALSE;  //la casella non porta da nessuna parte
mossa[px][py]=0;
return(FALSE);
}
void StampaSoluzione()
{
int i,j;
for(i=0;i<=9;i++){
    for(j=0;j<=9;j++){
        if(mossa[i][j]==0) printf("__ ");
        else printf("%2d ",mossa[i][j]);
        }
   printf("\n");
   }
}

Ciao Rooster,
    rileggendo l' esercizio che hai postato mi e' venuto un dubbio: ma nell' esercizio n.2
come sono le specifiche delle mosse? Io ho ipotizzato che ci si possa muovere solo in
diagonale, orizzontale o verticale ma solo sulle caselle vicine.
Ciao,
    Alessandro

"Alessandro F. DoppioGioco" wrote:

Si okay hai ipotizzato giusto !!! Ti ringrazio per il codice e adesso me lo guardo, poi ti
farò sapere.
Non andave bene il codice che avevo fatto per il primo esercizio?