DOMANDA random walk su c

roger21

Nuovo Utente
21
3
Avrei un problema relativo allo sviluppo di un programmino che simuli il cammino casuale di K passi di un asterisco su una griglia NxN; il programma è quasi completo,l'unica cosa che non riesco a fare è stampare su schermo una serie di + corrispondenti a tutte le posizioni occupate nei vari passi dall'asterisco,mi chiedevo dunque come memorizzare da qualche parte (un array?)i passi vari fatti dall'asterisco, in modo da poterli richiamare quando serve e mettere in quelle posizioni i +,se occorre posso allegare il codice,spero che il quesito sia lecito e la sezione quella adatta,grazie in anticipo
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Certo devi memorizzare in qualche modo le posizioni, puoi usare una lista con le posizioni oppure un vettore/matrice NxN in cui segni se in una data cella sei passato o meno.
 

roger21

Nuovo Utente
21
3
Certo devi memorizzare in qualche modo le posizioni, puoi usare una lista con le posizioni oppure un vettore/matrice NxN in cui segni se in una data cella sei passato o meno.
grazie,il fatto è che le varie posizioni sono variabili,non array,non so come assegnarle a un array e poi richiamare quell'array in modo che tutte le posizioni diverse vengano riportate a schermo
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Cioè... hai N^2 variabili? Spero di no...
Usa una matrice o un array anche per quelle. Poi avrai due variabili (i e j per esempio) che rappresentano la posizione corrente, il random walk lo implementi incrementando o decrementando di uno i o j. Ogni volta che modifichi i o j ti muovi e scrivi, per esempio, "1" in matrice[j]. Quando vai a stampare metterai una croce in una casella se la matrice contiene "1" in quella posizione.

ps: forse è meglio se ci fai vedere quello che hai fatto fin'ora
 

roger21

Nuovo Utente
21
3
Cioè... hai N^2 variabili? Spero di no...
Usa una matrice o un array anche per quelle. Poi avrai due variabili (i e j per esempio) che rappresentano la posizione corrente, il random walk lo implementi incrementando o decrementando di uno i o j. Ogni volta che modifichi i o j ti muovi e scrivi, per esempio, "1" in matrice[j]. Quando vai a stampare metterai una croce in una casella se la matrice contiene "1" in quella posizione.

ps: forse è meglio se ci fai vedere quello che hai fatto fin'ora

si,credo anche io,perchè di fatto non ho usato una matrice nell'algoritmo e credo che questo l'abbia reso piuttosto pesante,eccolo:
Codice:
[COLOR=#000000][FONT=Calibri]#include <stdio.h>[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]#include <stdlib.h>[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]#include <time.h>[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]#define N 9[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]#define M 9[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]#define B 7[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]int main(){[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    int i=0, j=0, h=0, l=0, a=N/2, b=M/2, c[B], d[B], k, z, seed=111, leng=4, lengz=3, e[B], f[B];  /*1 4 3 3 2*/[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    srand(seed);[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    c[0] = N/2;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    d[0] = M/2;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]for(i=0; i<(N+2); i++){  /*Stampa la prima griglia, il "passo 0"*/[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("=");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]printf("\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]for (j=0; j<M; j++) [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]{[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("|");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    for (i=0; i<N; i++)[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    {    [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        if (i==a && j==b)[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        printf("*");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        else printf("o");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    }[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("|\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}    [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]for(i=0; i<(N+2); i++){[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("=");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]printf("\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]printf("1^ passo\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]for(h=0; h<B-1; h++) {  /*Stampa le griglie relative ai passi successivi*/[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    k = rand() % leng+1;  /*Randomizzazione dei passi*/ [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]         if (k==1) {if(a<N && a>0) {c[h] = a; d[h] = b; a = a-1;} [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                    else {c[h] = a; d[h] = b; z = rand() % lengz+1; /*2*/[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        if(z==1) a = a+1;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==2) {if(b<M && b>0) b = b-1; else b = b+1;}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==3) {if(b<M-1) b = b+1; else b = b-1;}}}  /*Qui è necessario specificare il comportamento di entrambe le variabili c e d, per ogni possibilità casuale*/[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    else if (k==2) {if(a<N-1) {c[h] = a; d[h] = b; a = a+1;} [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                    else {c[h] = a; d[h] = b; z = rand() % lengz+1;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        if (z==1) a = a-1;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==2) {if(b<M && b>0) b = b-1; else b = b+1;}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==3) {if(b<M-1) b = b+1; else b = b-1;}}}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    else if (k==3) {if(b<M && b>0) {d[h] = b; c[h] = a; b = b-1;} [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                    else {d[h] = b; c[h] = a; z = rand() % lengz+1;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        if (z==1) b = b+1;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==2) {if(a<N && a>0) a = a-1; else a = a+1;}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==3) {if(a<N-1) a = a+1; else a = a-1;}}}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    else if (k==4) {if(b<M-1) {d[h] = b; c[h] = a; b = b+1;} [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                    else {d[h] = b; c[h] = a; z = rand() % lengz+1; [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        if (z==1) b = b-1;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==2) {if(a<N && a>0) a = a-1; else a = a+1;}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]                        else if (z==3) {if(a<N-1) a = a+1; else a = a-1;}}}                       [/FONT][/COLOR][COLOR=#000000][FONT=Calibri]                              [/FONT][/COLOR][COLOR=#000000][FONT=Calibri]                              [/FONT][/COLOR][COLOR=#000000][FONT=Calibri]                [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri] for(i=0; i<(N+2); i++){ /*Griglie varie*/[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("=");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]printf("\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri] for (j=0; j<M; j++) {[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("|");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    for (i=0; i<N; i++)[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    {   [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        e[0] = N/2;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        f[0] = M/2;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        e[1] = N/2;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        f[1] = M/2;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        for(l=1; l<h; l++){[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        e[l] = c[h-l]; [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        f[l] = d[h-l];}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        if (i==a && j==b)[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        printf("*");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        else if (i==N/2 && j==M/2)[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        printf("+");    [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        else if (i==c[h] && j==d[h])[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        printf("+");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        else if (i==e[l] && j==f[l])[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        printf("+");    [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]        else printf("o");   [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    }[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("|\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri] for(i=0; i<(N+2); i++){[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]    printf("=");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]printf("\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]printf("%d^ passo\n", h+2);[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]     if (k==1) printf("Sx\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]else if (k==2) printf("Dx\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]else if (k==3) printf("Su\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]else if (k==4) printf("Giù\n");[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}    [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]return 0;    [/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]}[/FONT][/COLOR]
 
Ultima modifica da un moderatore:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Cioè... hai N^2 variabili? Spero di no...
Usa una matrice o un array anche per quelle. Poi avrai due variabili (i e j per esempio) che rappresentano la posizione corrente, il random walk lo implementi incrementando o decrementando di uno i o j. Ogni volta che modifichi i o j ti muovi e scrivi, per esempio, "1" in matrice[j]. Quando vai a stampare metterai una croce in una casella se la matrice contiene "1" in quella posizione.

ps: forse è meglio se ci fai vedere quello che hai fatto fin'ora

Non fa prima a fare un'array di char ed impostare il valore di ogni casella a ' * ' e ' + ' ? Dopo fa i soliti due cicli for e stampa tutta la griglia.

P.S:
il fatto è che le varie posizioni sono variabili
non vuol dire che sta usando la funzione rand() ( ed affini) ?
 

roger21

Nuovo Utente
21
3
Non fa prima a fare un'array di char ed impostare il valore di ogni casella a ' * ' e ' + ' ? Dopo fa i soliti due cicli for e stampa tutta la griglia.

P.S: non vuol dire che sta usando la funzione rand() ( ed affini) ?
si,ho usato rand,lo script è nel commento sopra,grazie della risposta,non conosco molto bene la char,come dovrei usarla?
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define N 5


int main() {
    
    int i, j, a , b;
    char c[N][N];
    char decisione = 's';
    
    srand(time(NULL));
    
    for ( i = 0; i < N; i++) {   //stampa la griglia iniziale
        for ( j = 0; j < N; j++) {
            c[i][j] = '-';
        }
        printf("\n");
    }
    
    while(decisione != 'n') {
        
        do {
            a = rand()%N;
            b= rand()%N;
        } while (c[a][b] == '*' || c[a][b] == '+'); //randomizza la posizione, se è occupata dall'asterisco o dal '+' randomizza di nuovo
        
        c[a][b] = '*'; //imposta l'asterisco nella posizione trovata
        
        for ( i = 0; i < N; i++) {   //stampa la griglia aggiornata
            for ( j = 0; j < N; j++) {
                printf(" %c", c[i][j]);
            }
            printf("\n");
        }
        
        c[a][b] = '+'; //l'asterisco viene cambiato con il + nella posizione corrente
        
        printf("Vuoi continuare? s/n\n");
        scanf(" %c", &decisione);
    }
    
    return 0;
    
}
@roger21

Prova a vedere questo, non ho messo la condizione finale che se l'asterisco è passato in tutte le posizioni il programma si deve chiudere (o resettare o continuare), in caso bata cambiare l'if all'inizio del while (mi pare, non ricordo :asd:) o aggiungere una variabile count ( griglia 5x5 sono 25 posizioni )
 
Ultima modifica:

roger21

Nuovo Utente
21
3
Codice:
#include <stdio.h>#include <stdlib.h>
#include <time.h>


#define N 5


int main() {
    
    int i, j, a , b;
    char c[N][N];
    char decisione = 's';
    
    srand(time(NULL));
    
    for ( i = 0; i < N; i++) {
        for ( j = 0; j < N; j++) {
            c[i][j] = '-';
        }
        printf("\n");
    }
    
    while(decisione != 'n') {
        
        do {
            a = rand()%N;
            b= rand()%N;
        } while (c[a][b] == '*' || c[a][b] == '+');
        
        c[a][b] = '*';
        
        for ( i = 0; i < N; i++) {
            for ( j = 0; j < N; j++) {
                printf(" %c", c[i][j]);
            }
            printf("\n");
        }
        
        c[a][b] = '+';
        
        printf("Vuoi continuare? s/n\n");
        scanf(" %c", &decisione);
    }
    
    return 0;
    
}
@roger21

Prova a vedere questo, non ho messo la condizione finale che se l'asterisco è passato in tutte le posizioni il programma si deve chiudere (o resettare o continuare), in caso bata cambiare l'if all'inizio del while (mi pare, non ricordo :asd:) o aggiungere una variabile count ( griglia 5x5 sono 25 posizioni )
ah,wow,eccezionale,grazie :D,cercherò di trarne spunto modificando il mio codice perchè ho l'obbligo di mandarne uno originale
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
si,ho usato rand,lo script è nel commento sopra,grazie della risposta,non conosco molto bene la char,come dovrei usarla?
Il char permette di memorizzare un singolo carattere da 8bit (1 byte) ( al contrario, una variabile int, in una macchina a 64bit, occupa 64bit (mi pare, è tardi :asd:)).
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
perfetto,grazie mille,il tuo codice è straordinariamente snello e chiaro,gentilissimo
Figurati, ho aggiunto anche i commenti per rendertelo più leggibile. :sisilui:
 
  • Mi piace
Reazioni: roger21

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
mm,ho giusto da fare un paio di modifiche perchè la griglia deve essere confinata e poi l'asterisco deve partire dal centro della griglia stessa
Occhio che l'asterisco si sposta senza un particolare ordine, prima può essere in alto a destra poi in basso a sinistra
 

roger21

Nuovo Utente
21
3
Occhio che l'asterisco si sposta senza un particolare ordine, prima può essere in alto a destra poi in basso a sinistra
lo vedo,dovrei riuscire a fissare la posizione iniziale nel centro,poi deve muoversi casualmente all'interno della griglia,inoltre devo stampare tante griglie quanti sono gli spostamenti (cioè 20 definiti di default come macro)

- - - Updated - - -

Ho notato adesso che la richiesta dell'assegnamento non coincide precisamente, infatti il moto deve essere circoscritto alle posizioni immediatamente vicine al '*', rispetto ai punti cardinali diciamo. Qualche idea?
 
Ultima modifica:

Entra

oppure Accedi utilizzando