2016-06-01 44 views
0

所以我正在做一個dfs實踐的迷宮生成器程序。以結構格式操縱數據最後很奇怪

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) 
    {} 
}; 

和我已經使用一個for循環來初始化點, 每個矢量的矢量與一個唯一的地址和指定爲假的訪問的值。

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]; 
      } 
     } 

然而,當我一個DFS搜索過程中操縱它們奇怪的事情發生了......

每當我執行這個代碼段

  board[now->y][now->x]->visited=true; 
每個向量的第一個值的

板(board [x] [0])也被更改爲true,因爲使用此循環進行檢查。

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

我應該怎麼做柱操縱點之一,而不是列的一個

全DFS功能:

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); 
      } 
     } 
    } 

完整的構造函數:

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

你可以在調用'board [now-> y] [now-> x] - > visited = true;''時放入完整的代碼片段嗎?什麼是'tempv'聲明? –

+0

剛剛添加它,感謝您的關注:D – haleyk

回答

0

在將其重新放入板後,您並未清除tempv。所以董事會的每個條目都收到tempv的擴展副本。 (具體地,第一條目col將每行中是相同的。)

只需撥打tempv.clear()board.push_back(tempv)後,使每一行用空載體開始。

+0

哎呀!這是我的一個粗心的舉動。現在代碼運行正常,感謝您的幫助! :D – haleyk

+0

@haleyk happydave肯定會很高興讓你選出的答案作爲最佳答案:-) –