2016-06-01 5 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) 
    {} 
}; 

と私は固有のアドレスとfalseとして割り当てられた訪問した値でポイント、 それぞれのベクトルのベクトルを初期化するために、forループを使用しています。私は、DFSの検索時にそれらを操作するときしかし、奇妙な何かが起こる

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

...私はこのコードのセグメントを実行するたびに

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

のベクトルの最初の値のそれぞれboard(x [0])もtrueに変更され、forループでチェックされます。

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

私は列でポイントに代わりに列の1の1を操作するために何をすべきか

フル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の拡張コピーを受信して​​います。具体的には、最初のcolのエントリは各行で同じになります。

の直後にboard.push_back(tempv)の後にコールすると、各行は空のベクトルで始まります。

+0

おっと!それは私の不注意な動きでした。今すぐコードが調整でうまく動作し、助けてくれてありがとう! :D – haleyk

+0

@haleyk happydaveは、彼の答えをあなたが最良の答えとして選んだのはうれしいでしょう:-) –