主要是好久没有刷这种算法的题了,有点生疏,现在先把代码贴上吧,主要是一个深搜的使用,这里0,1,2应该是记录行列还有对角线的 具体以后再解释 先贴上代码
#include<iostream>
#include<cstring>
using namespace std;
//用于计数的值 和记录有没有被访问过
int cnt = 0,n,vis[3][10000];
void dfs(int cur){
if(cur == n){
cnt++;
return;
}
for(int i = 1; i <= n; i++) {
//在对角线还有行列上都没有被访问过
if(!vis[0][i] && !vis[1][cur + i] &&!vis[2][cur - i + n]) {
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
dfs(cur + 1);
//取消值
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
}
}
}
int main() {
while (cin>>n) {
memset(vis, 0, sizeof(vis));
//从第0行开始
cnt = 0;
dfs(0);
cout<<cnt<<endl;
}
return 0;
}