C-C中的N-Queen回溯很奇怪

时间:2017-12-13 14:42:15

标签: c++ recursion backtracking

所以我有这个代码,我正在尝试用c ++创建自己的n-queen程序来学习算法和回溯。

但是我在第46行中没有理解一些奇怪的行为,它没有将指定索引的2D char数组设置为'0',但是如果我将第46行中的代码移动到第48行,它就可以工作了。任何解释为什么会发生这种情况?

第二个问题,当我将第46行中的代码移动到第48行时,它工作正常,数组2d的输出正确。但函数f的最终返回并不像我预期的那样,而是打印4,它打印出62。

#include <bits/stdc++.h>
using namespace std;
bool check(char g[][4],int x, int y){
    for (int i=x,j=y; i>-1 && y>-1; i--,j--)
        if (g[i][j]=='1')
            return false;
    for (int i=0; i<4; i++)
        if (g[i][y]=='1')
            return false;
    for (int i=x,j=y; i>-1 && j<4; i--, j++)
        if (g[i][j]=='1')
            return false;
    for (int j=0; j<4; j++)
        if (g[x][j]=='1')
            return false;
    for (int i=x,j=y; i<4 && j<4; i++, j++)
        if (g[i][j]=='1')
            return false;
    for (int i=x,j=y; i<4 && j>-1; i++, j--)
        if (g[i][j]=='1')
            return false;
    return true;
}
bool done(char g[][4]){
    int counts=0;
    for (int i=0; i<4 ; i++){
        for (int j=0; j<4; j++){
            if (g[i][j]=='1')
                counts++;
        }
    }
    if (count==4)
        return true;
    else
        return false;
}
int f(char g[][4],int n, int m){
    if (done(g)){
        return 1;
    }
    for (int i=0; i<n; i++){
        for (int j=0; j<m; j++){
                if (check(g,i,j)){
                    g[i][j]='1';
                    return 1 + f(g,n,m);
                    g[i][j]='0'; //Backtracking
                }

        }
    }

    return -1;
}
int main(){
    char gr[4][4]={
    {'0','0','0','0'},
    {'0','0','0','0'},
    {'0','0','0','0'},
    {'0','0','0','0'}
    };

    cout << f(gr,4,4) << endl << endl;
    for (int i=0; i<4; i++){
        for (int j=0; j<4; j++){
            cout << gr[i][j] << " ";

        }
        cout << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

你返回1 + f(g,n,m);在第45行中的if范围。所以永远不会到达第46行。

如果你将第46行放到第48行,你将退出返回阻止其执行的范围。

你不应该在返回和范围结束括号之间放置代码。

ylso在许多IDE中,您会收到无法访问代码的响应。

几乎就是全部:)

enter image description here