直接上代码附有解析
#include<bits/stdc++.h>
using namespace std;
struct node///坐标数组
{
int x,y;
}Node[15];
bool visit[15]={false};
int n,ans=0;
bool check(node a,node b)///判断是否在同一对角线上
{
int l1=abs(a.y-b.y),l2=abs(a.x-b.x);///l1,l2为一直角三角形的两条边
if(l1==l2) return false;///若l1==l2,则说明在同一对角线上
return true;
}
void dfs(int index)
{
if(index>n) {ans++; return ;}///能到这里就说明满足题目要求,ans加一
for(int i=1;i<=n;i++)
{
node a;a.x=index,a.y=i;///记录即将放棋子的位置
if(visit[i]==false)///若该列没访问,可继续下面的判断
{
bool flag=true;///假设当前列可以放棋子
for(int j=1;j<index;j++)///位置a与之前的位置相对比,进行检测
{
///若即将落子的地方无法满足不在同一斜线上,则当前列不可以放棋子,flag=false;然后回溯
if(check(a,Node[j])==false) {flag=false;break;}
///要break,不能return,因为只能说明第index行第i列不能放棋子,还要判断第i+1列能否放棋子
///若return,则直接返回到第index-1行了,没有判断完第index行的所有位置
}
///满足check条件
if(flag)///可以放
{
visit[i]=true;///访问
Node[index].x=index,Node[index].y=i;///记录到第index层所放的所有棋子坐标
dfs(index+1);///继续往下一层搜索
visit[i]=false;///该层运行结束,要将棋子拿起来,回到开始时的状态
}
}
}
}
int main()
{
cin>>n;///1s内,n最大到12;
dfs(1);
cout << ans << endl;
return 0;
}