我正在尝试使用向量和类在C ++中使用回溯来解决著名的NQUEENS问题。但这在某些情况下(例如5)给出了正确的结果,而对于其余情况(例如4)则给出了正确的结果,表明“解决方案不存在”。
我的代码如下: 用于存储女王位置的行和列的类声明。
class position
{
public:
int r,c;
position(int r,int c)
{
this->r=r;
this->c=c;
}
};
递归函数:
vector<position> positions;
bool solve(int n, int r)
{
if(r==n)
return true;
for (int c = 0; c < n; ++c)
{
bool safe=true;
for(int q=0;q<r;++q)
{
if (positions[q].c == c || positions[q].r - positions[q].c == r - c || positions[q].r + positions[q].c == r + c)
{
safe = false;
break;
}
}
if(safe)
{
position p(r,c);
positions.push_back(p);
if(solve(n,r+1))
return true;
}
}
return false;
}
,驱动程序功能如下:
int main()
{
int n;
cin>>n;
if(!solve(n,0))
{
cout<<"Solution doesn't exist"<<endl;
return 0;
}
printboard(n);
return 0;
}
请帮助我解决这个问题。
答案 0 :(得分:2)
if(solve(n,r+1))
return true;
else
positions.erase(positions.begin()+positions.size()-1);
如果不存在一个单元的解决方案,则从可能的位置擦除该单元,以免发生冲突。 编辑:- 谢谢Bo R先生的纠正。