C++ C+中的N个皇后+;使用向量
我很难理解回溯,我可以从概念上理解我们正在采取行动,然后如果没有解决方案,我们尝试下一个解决方案 考虑到这一点,我试图解决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
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