输入样例
6
输出样例
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
本题主要思想是用递归一一枚举然后暴力解决,主要难点是怎么排除下一个点是否放在该放的位置。
不在同意对角线可用gd,ugd来表示该对角线是否包涵一个点的坐标。
原理y=x+b、y=-x+b公式可得,两条对角线中y+x和y-x是一个定值,然后用对应的定值保存即可。
实际代码如下
#include<iostream>
using namespace std;
const int N=15;
bool cot[N],gd[N*2],ugd[N*2];//cot表示第n行放在第m列(记忆放的棋子的位置然后输出)
int n,ans=0,pos[N];
void dfs(int x)
{
if(x>n)
{
ans++;
if(ans<=3)
{
for(int i=1;i<=n;i++)
cout<<pos[i]<<" ";
cout<<endl;
}
}
for(int i=1;i<=n;i++)
{
if(!cot[i]&&!gd[x+i]&&!ugd[x-i+n])
{
pos[x]=i;
cot[i]=gd[x+i]=ugd[x-i+n]=true;
dfs(x+1);
cot[i]=gd[x+i]=ugd[x-i+n]=false;
}
}
}
int main(void)
{
cin>>n;
dfs(1);
cout<<ans;
}
需要注意的点,对角线的表示,可以用x,y之间的关系表示。
网址如下
https://www.acwing.com/video/2316/