NQUEENS问题的C ++递归解决方案无法正常工作

时间:2019-02-17 05:54:36

标签: c++ algorithm backtracking

我正在尝试使用向量和类在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;
}

请帮助我解决这个问题。

1 个答案:

答案 0 :(得分:2)

if(solve(n,r+1))
  return true;
else
    positions.erase(positions.begin()+positions.size()-1);

如果不存在一个单元的解决方案,则从可能的位置擦除该单元,以免发生冲突。 编辑:-        谢谢Bo R先生的纠正。