在处理这些类型的回溯问题时是否需要DFS?

时间:2019-06-24 12:28:17

标签: backtracking

遇到迷宫问题:
考虑将老鼠放置在 n 顺序的正方形矩阵m [] [] 中的(0,0)处,并且必须到达目的地(n-1,n-1)。您的任务是完成函数 printPath(),该函数返回一个排序的字符串数组,该数组表示大鼠可以到达(n-1,n-1)的目的地的所有可能方向。 )。老鼠可以移动的方向是“ U”(上),“ D”(下),“ L”(左),“ R”(右)

示例:
1 0 0 0
1 1 0 1
1 1 0 0
0 1 1 1

输出:
DDRDRR DRDDRR

我想出了以下代码:

vector<string> printPath(int m[MAX][MAX], int n){
    vector<string> ans;
    if(m[0][0]==0)
    return ans;

    queue<pair <pair<int,int>, string > >q;
    q.push({{0,0},""});
    m[0][0] = 0;
    int X[] = {0,1,0,-1};
    int Y[] = {1,0,-1,0};
    string t= "";
    while(!q.empty()){
        pair<pair<int,int>,string> front = q.front();
        q.pop();
        if(front.first.first == n-1 && front.first.second == n-1){
            ans.push_back(front.second);
        }
        for(int i=0; i<4; i++){
            int newx = front.first.first + X[i];
            int newy = front.first.second + Y[i];
            if(newx>=0 && newy>=0 && newx<n && newy<n && m[newx][newy]==1){
                if(i==0)
                 q.push({{newx,newy},front.second + "R"});
                else if(i==1)
                 q.push({{newx,newy},front.second + "D"});
                else if(i==2)
                 q.push({{newx,newy},front.second + "L"});
                else if(i==3)
                 q.push({{newx,newy},front.second + "U"});

                m[newx][newy] = 0;
            }
        }
    }
    sort(ans.begin(), ans.end());
    return ans;
}

问题在于,它仅打印许多可能的有效路径中的一个有效路径。我在某处读到,使用DFS可以完成的所有事情都可以使用BFS完成。
要打印所有可能的路径,我可以将 n x n 矩阵的副本放入队列中。因为当我们在同一问题上执行DFS时,会将 n x n 矩阵的副本传递给每个递归调用,对吗?
那么问题是哪种方法在内存需求方面更好?

0 个答案:

没有答案