2016-06-01 9 views
0

Also arbeite ich an einem Labyrinth-Generator-Programm als eine dfs-Praxis.Manipulieren von Daten im Struct-Format endet seltsam

struct Point{ 
    Point *left,*right,*up,*down; 
    int x,y; 
    bool visited; 
    Point(int n,int m) 
     :x(n),y(m),visited(false),left(NULL),right(NULL),up(NULL),down(NULL) 
    {} 
}; 

und ich habe eine for-Schleife zu initialisieren, einen Vektor der Vektor von Point, jedes mit einer eindeutigen Adresse und dem besuchten Wert zugeordnet als falsch eingesetzt.

vector<vector<Point*> > board; 
     for(i=0;i<row;i++){ 
      for(j=0;j<col;j++){ 
       Point *temppt=new Point(j,i); 
       tempv.push_back(temppt); 
      } 
      board.push_back(tempv); 
     } 
     for(i=0;i<row;i++){ 
      for(j=0;j<col;j++){ 
       if(i!=0)board[i][j]->up=board[i-1][j]; 
       if(i!=row-1)board[i][j]->down=board[i+1][j]; 
       if(j!=0)board[i][j]->left=board[i][j-1]; 
       if(j!=col-1)board[i][j]->right=board[i][j+1]; 
      } 
     } 

jedoch etwas seltsam passiert, wenn ich sie während einer dfs Suche manipulieren ...

, wenn ich dieses Segment von Code ausführen

  board[now->y][now->x]->visited=true; 

jeweils den ersten Wert des Vektors board (board [x] [0]) werden ebenfalls in true geändert, wie es mit dieser for-Schleife überprüft wurde.

 for(int i=0;i<row;i++){ 
      for(int j=0;j<col;j++){ 
       cout<<board[i][j]->visited; 
      } 
      cout<<endl; 
     } 

Was soll ich tun, die Punkte eines von einem statt Spalte für Spalte zu manipulieren

Die vollständige dfs Funktion:

void dfs(Point* now,Point* prev,int cnt){ 
     int dir,back; 
     if(now->visited!=true){ 
      cnt++; 
      if(prev!=NULL){ 
       if(prev->up==now){ 
        hwall[now->x][now->y]=false; 
       } 
       else if(prev->down==now){ 
        hwall[prev->x][prev->y]=false; 
       } 
       else if(prev->right==now){ 
        vwall[prev->y][prev->x]=false; 
       } 
       else vwall[now->y][now->x]=false; 
      } 
      board[now->y][now->x]->visited=true; 
     } 
     for(int i=0;i<row;i++){ 
      for(int j=0;j<col;j++){ 
       cout<<board[i][j]->visited; 
      } 
      cout<<endl; 
     } 
     if(cnt<row*col){ 
      back=rand()%10; 
      vector<Point*> temp; 
      if(back<5){ 
       A:; 
       if(now->up!=NULL)temp.push_back(now->up); 
       if(now->right!=NULL)temp.push_back(now->right); 
       if(now->down!=NULL)temp.push_back(now->down); 
       if(now->left!=NULL)temp.push_back(now->left); 
       dfs(temp[rand()%temp.size()],now,cnt); 
      } 
      else{ 
       if(now->up!=NULL&&now->up->visited!=true)temp.push_back(now->up); 
       if(now->right!=NULL&&now->right->visited!=true)temp.push_back(now->right); 
       if(now->down!=NULL&&now->down->visited!=true)temp.push_back(now->down); 
       if(now->left!=NULL&&now->left->visited!=true)temp.push_back(now->left); 
       if(temp.size()==0)goto A; 
       dfs(temp[rand()%temp.size()],now,cnt); 
      } 
     } 
    } 

Der vollständige Konstruktor:

Maze(int n,int m):row(n),col(m){ 
     int i,j; 
     vector<Point*> tempv; 
     for(i=0;i<row;i++)vwall.push_back(vector<bool>(col-1,true)); 
     for(i=0;i<col;i++)hwall.push_back(vector<bool>(row-1,true)); 
     for(i=0;i<row;i++){ 
      for(j=0;j<col;j++){ 
       Point *temppt=new Point(j,i); 
       tempv.push_back(temppt); 
      } 
      board.push_back(tempv); 
     } 
     for(i=0;i<row;i++){ 
      for(j=0;j<col;j++){ 
       if(i!=0)board[i][j]->up=board[i-1][j]; 
       if(i!=row-1)board[i][j]->down=board[i+1][j]; 
       if(j!=0)board[i][j]->left=board[i][j-1]; 
       if(j!=col-1)board[i][j]->right=board[i][j+1]; 
      } 
     } 
     dfs(board[0][0],NULL,0); 
    } 
+0

Kannst du das fertige Code-Snippet beim Aufruf von 'board [now-> y] [now-> x] -> visited = true;'? Und was ist 'tempv' Deklaration? –

+0

Nur hinzugefügt, vielen Dank für Ihre Aufmerksamkeit: D – haleyk

Antwort

0

Du löschst TempV nicht, nachdem du es wieder in das Board gedrückt hast. So erhält jeder Eintrag der Karte eine erweiterte Kopie von tempv. (Insbesondere sind die ersten col Einträge in jeder Zeile identisch.)

Rufen Sie einfach direkt nach board.push_back(tempv), so dass jede Zeile mit einem leeren Vektor beginnt.

+0

Whoops! Das war eine sorglose Bewegung von mir. Jetzt läuft der Code gut mit der Anpassung, danke für die Hilfe! : D – haleyk

+0

@haleyk happydave würde sich sicherlich freuen, seine Antwort als beste Antwort von dir auswählen zu lassen :-) –