以struct格式处理数据最终变得奇怪

时间:2016-06-01 03:06:01

标签: c++ depth-first-search

所以我正在开发迷宫生成器程序作为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循环来初始化Point的向量向量, 每个都有一个唯一的地址,访问值被指定为false。

    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 for循环检查它。

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

1 个答案:

答案 0 :(得分:0)

你把它推回去后,你并没有清除它。因此,每个电路板条目都会收到tempv的扩展副本。 (具体来说,第一个col条目在每一行中都是相同的。)

只需在tempv.clear()之后立即致电board.push_back(tempv),以便每行以空矢量开头。