N-Queens
The n-queens puzzle is the problem of placing n queens on ann×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
解法:
典型的深搜算法,直接上代码:
#include <iostream>
#include<vector>
#include <string>
using namespace std;
//C(N,0)表示第i行皇后所在的列数
void DFS(vector<int> C, vector<vector<string>> &result, int row)
{
int flag=0; //与前面的皇后所在的列有没有冲突
int N=C.size();
if (row == N)
{
//输出结果
vector<string> solution;
for (int i=0;i<N;i++)
{
string s(N,'.');
for (int j=0;j<N;j++)
{
if (j == C[i])
{
s[j]='Q';
}
}
solution.push_back(s);
}
result.push_back(solution);
return;
}
for (int j=0;j<N;j++) //逐列尝试
{
flag=0;
for(int i=0;i<row;i++)
{
if (j==C[i] || abs(j-C[i]) == abs(i-row))
{
flag=1; // 有冲突
break;
}
}
if (!flag)
{
C[row]=j;
DFS(C, result, row+1);
}
}
}
int main()
{
int N=8;
vector<int> C(N,0);
vector<vector<string>> result;
DFS(C, result, 0);
return 0;
}