N皇后模板题,顺便复习一下N皇后:
首先给出三个数组,列数组,主对角线数组,副对角线数组,代表行/对角线是否被占用。
因为每一行只能放一个元素,所以每遍历一次如果他可以放(即对应列和两个对角线上都没皇后)就标记一个,代表这个元素放置后他的列以及对角线都被占用,如此不断递归即得答案。
PS:这题输入样例又有问题,没有Case。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
const int MAXN = 20;
const int INF = INT_MAX;
bool visit[3][MAXN];
vector<string> ans;
void dfs(int row, string path){
if(row == 8){
ans.push_back(path);
return;
}
for(int i = 0; i < 8; i++){
if(!visit[0][i - row + 8] && !visit[1][i] && !visit[2][i + row]){
visit[0][i - row + 8] = visit[1][i] = vis