PROBLEMA Cammino casuale in C

Stefani

Nuovo Utente
2
0
Ciao! :)
Ho un problema con questo esercizio:

"Scrivete un programma che generi un "cammino casuale" in un vettore 10x10.
Il vettore conterrà dei caratteri, inizialmente saranno tutti '.' .
Il programma deve passare casualmente da un elemento all'altro muovendosi in alto, in basso, a sinistra o a destra di una posizione soltanto. Gli elementi visitati dal programma dovranno essere etichettati con le lettere che vanno dalla A alla Z nell'ordine in cui vengono visitati. "

Ho scritto il codice, ma non riesco a capire perché una volta compilato il programma, come output anziché stamparmi tutte le lettere, me ne stampa solo alcune. Cos'è che sbaglio? :help:

Ecco il codice:

Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define DIM 10

int main(){
     
      int i, j;
      int c, r, dir;
      int vettore[DIM][DIM];
      char lettera=65;
     
      srand((unsigned) time(NULL));
     
      for(i=0; i<DIM; i++){
            for(j=0; j<DIM; j++)
                  vettore[i][j]='.';
      }

      r=rand()%10;
      c=rand()%10;
      vettore[r][c]=lettera;

      do{
            dir=rand()%10;
            dir/=4;
            lettera++;
            switch(dir){
                  case 0: if (vettore[r-1][c]=='.') vettore[r-1][c]=lettera; break;
                  case 1: if (vettore[r+1][c]=='.') vettore[r+1][c]=lettera; break;
                  case 2: if (vettore[r][c-1]=='.') vettore[r][c-1]=lettera; break;
                  case 3: if (vettore[r][c+1]=='.') vettore[r][c+1]=lettera; break;
            }
      }while(lettera<90);

      for(i=0; i<DIM; i++){
            for(j=0; j<DIM; j++)
                  printf("%2c", vettore[i][j]);
            printf("\n");
      }
     
      return 0;
}
 

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
mi sembra che r e c non cambino mai di valore, quindi dopo aver scritto delle lettere nella cella iniziale e nelle 4 adiacenti, il programma skippa le altre lettere perchè non trova caselle libere. Potresti fare così:
Codice:
switch(dir){     
   case 0: if (vettore[r-1][c]=='.') vettore[--r][c]=lettera; break;     
   case 1: if (vettore[r+1][c]=='.') vettore[++r][c]=lettera; break;     
   case 2: if (vettore[r][c-1]=='.') vettore[r][--c]=lettera; break;     
   case 3: if (vettore[r][c+1]=='.') vettore[r][++c]=lettera; break;
}
Tuttavia ci sono altri aspetti da considerare.
Innanzi tutto tu fai un solo tentativo di scrittura per ogni lettera, per cui se la condizione if di uno dei case è falsa, la lettera non viene scritta e il programma passa subito alla successiva.
Esempio matrice 3x3 partendo da (1,1):
1) M(1,1)='A'
2) lettera B, spostamento casuale = alto, M(1,0) libera? Si => M(1,0)='B'
3) lettera C, spostamento casuale = basso, M(1,1) libera? No => do nothing
4) lettera D, spostamento casuale = basso, M(1,2) libera? Si => M(1,2)='D'
...
mi sono perso la C.

C'è poi un altro particolare da considerare: può succedere che comunque lo spostamento casuale porti in una cella non adiacente a celle libere, per cui nessun'altra lettera verrà scritta.
 
  • Like
Reactions: Stefani

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 17 18.3%
  • Gearbox

    Voti: 1 1.1%
  • Xbox & Bethesda

    Voti: 66 71.0%
  • Square Enix

    Voti: 3 3.2%
  • Capcom

    Voti: 5 5.4%
  • Nintendo

    Voti: 14 15.1%
  • Altro (Specificare)

    Voti: 8 8.6%

Discussioni Simili