gpt4 book ai didi

c++ - N-Queen问题:无法弄清楚为什么我的解决方案不起作用

转载 作者:行者123 更新时间:2023-12-01 14:57:24 24 4
gpt4 key购买 nike

我正准备参加即将面试的标准N皇后问题。
我尝试空运行我的代码,它似乎运行良好。我无法在代码中发现错误。
我逐列遍历它,并使用回溯从不正确的路径返回。
谁能为我提供帮助,为什么它不能提供所需的输出(详细信息如下)?
这是problem statement

#include<bits/stdc++.h>
using namespace std;

void solve(vector<vector<int>> &ans, vector<int> &curr, int col, int n){
if(col==n){
ans.push_back(curr);
return;
}
bool flag=false;

for(int row=0; row<n; row++){
if(col==0){
curr.push_back(row);
solve(ans, curr, col+1, n);
curr.pop_back();
}
else{
for(int i=0; i<curr.size(); i++){
if((curr[i] == row) || (abs(row-curr[i]) == (col-i))){
flag=true;
break;
}
}
if(flag)
continue;
curr.push_back(row);
solve(ans, curr, col+1, n);
curr.pop_back();
}
}
}

int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
vector<vector<int>> ans;
vector<int> curr;
solve(ans, curr, 0, n);
for (int i = 0; i < ans.size(); i++) {
cout << "[";
for (int j = 0; j < ans[i].size(); j++)
cout << ans[i][j]+1 << " ";
cout << "]";
}
cout << endl;
}
return 0;
}
输入示例如下:
2
1
4
相应的输出将是:
[1 ]
[2 4 1 3 ] [3 1 4 2 ]
编译器给我输出(用于我的代码):
[1 ]

最佳答案

当前,在各行中重复使用了bool flag变量(用于检查是否在(row, col)上放置一个皇后区是否与curr中的任何现有皇后区相交)。
因此,如果将bool flag=false;行放在for(int i=0; i<curr.size(); i++){上方,它将为您的测试用例生成正确的输出。
其他说明:

  • 创建一个单独的函数bool does_intersect(const vector<int>& cur, int row, int col)来检查皇后区交叉点条件可能会更容易,这样就不需要bool flag变量了。
  • 可以删除if(col==0){条件,因为它不会执行else部分无法处理的任何操作。
  • 关于c++ - N-Queen问题:无法弄清楚为什么我的解决方案不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62540493/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com