N皇后问题回溯法
N皇后问题是典型的回溯算法,在一个N*N的棋盘上放置N个皇后。当前放置的皇后,不能与前面已经放好的皇后冲突。判断当前位置合法的办法就是将当前放置位置与前面放置好的每个皇后的位置进行比较,如果不在一条直线或者一条斜线上,则放置皇后,否则寻找下一个位置放置。
#include <iostream>
#include <vector>
using namespace std;
//N 个皇后
#define N 8
//记录每一行皇后的位置
vector<int> queen(N);
//存储所有情况
vector<vector<int> > result;
int abs(int a)
{
return a>0?a:-a;
}
//判断放置位置合法函数
bool check(int n)
{
for (int i = 0; i < n; ++i) {
if (queen[n] == queen[i])
return false;
if(n-i == abs(queen[n]-queen[i]))
return false;
}
return true;
}
void DFS(int step)
{
if(step==N)
{
result.emplace_back(queen);
return;
}
for (int i = 0; i <N ; ++i) {
queen[step] = i;
if(check(step)){
DFS(step+1);
}
}
}
int main() {
int count = 0;
DFS(0);
for(auto &res:result)
{
cout<<"第"<<count<<"case:\t";
for (int i = 0; i <N; ++i) {
cout<<res[i]<<' ';
}
count++;
cout<<endl;
}
return 0;
}