Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的N个皇后+;使用向量_C++_Backtracking_N Queens - Fatal编程技术网

C++ C+中的N个皇后+;使用向量

C++ C+中的N个皇后+;使用向量,c++,backtracking,n-queens,C++,Backtracking,N Queens,我很难理解回溯,我可以从概念上理解我们正在采取行动,然后如果没有解决方案,我们尝试下一个解决方案 考虑到这一点,我试图解决N皇后区的问题, 我会找出所有可能排在下一行的候选人,然后一个接一个地尝试,如果候选人没有给出解决方案,我会弹出它,然后选择下一个 这是我提出的代码的核心: void n_queens(int n) { vector<int> queens = vector<int>(); backtrack(queens,0,n); } void back

我很难理解回溯,我可以从概念上理解我们正在采取行动,然后如果没有解决方案,我们尝试下一个解决方案

考虑到这一点,我试图解决N皇后区的问题, 我会找出所有可能排在下一行的候选人,然后一个接一个地尝试,如果候选人没有给出解决方案,我会弹出它,然后选择下一个

这是我提出的代码的核心:

void n_queens(int n)
{
  vector<int> queens = vector<int>();
  backtrack(queens,0,n);
}

void backtrack(vector<int>& queens, int current_row, int N)
{
  // check if the configuration is solved
  if(is_solution(queens, N))
  {
    print_solution(queens,N);
  }
  else
  {
    // construct a vector of valid candidates
    vector<int> candidates = vector<int>();
    if(construct_candidates(queens,current_row,N,candidates))
    {
      for(int i=0; i < candidates.size(); ++i)
      {
        // Push this in the partial solution and move further
        queens.push_back(candidates[i]);
        backtrack(queens,current_row + 1,N);
        // If no feasible solution was found then we ought to remove this and try the next one
        queens.pop_back();
      }
    }
  }
}

bool construct_candidates(const vector<int>& queens, int row, int N, vector<int>& candidates)
{
  // Returns false if there are no possible candidates, we must follow a different
  // branch if this so happens
  for(int i=0; i<N; ++i)
  {
    if(is_safe_square(queens,row,i,N))
    {
      // Add a valid candidate, this can be done since we pass candidates by reference
      candidates.push_back(i);
    }
  }
  return candidates.size() > 0;
}

这不是一个根本问题,只是一个bug

是否安全\u square
中,更改

queens[i] == row


你如何给女王编码?对我来说,看起来你只存储了皇后坐标的一维。使用结构存储两个坐标或将它们编码为单个整数。顺便说一句:vector queens=vector();这是不寻常的,只要使用向量皇后,也会这样做。因为我们每行只能有一个皇后,所以我只存储列。非常感谢,我是个白痴。我会尝试更多的问题,并建立在我的理解之上。@nikhil:因为它在这个非常小的修正上工作得非常好,我想说你远非白痴——恰恰相反。这种错误年复一年地发生,但(奇怪的是)几乎总是被别人发现。
queens[i] == row
i == row