这道题很明显就是用深度优先搜索,也就是DFS
那到底要怎么去DFS呢?
它说行,列,两条对角线不能在一起。所以DFS的行参就可以是行,再用一个数组存列,两个数组去存放两条对角线。(注:存两个对角线的要是行的2倍,要不然会数组越界)
那么还有一个问题,就是每一种方法存的答案。
可以用一个a数组去存放答案
DFS的出口就是当行到达n+1,如果是到n的形况下,无法统计在第n行要放的列。
首先,先判答案是不是在2种及以下,应为是在判断后ans++的。如果小于3的话那么输出答案,方案数+1,返回上一次,return ;
if(r==n+1){
if(ans<3){
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
ans++;
return ;
}
后面开一个for循环,枚举每一次可以放置的位置
先判断这两个对角线还有列在上面出现没,如果出现了就continue;
如果没有,就把这一列存放在a数组里,再两个对角线和列标上1
然后去上下一层,当他返回时,也就没有在走过这里列,所以要回溯,把这些变量都表1
for(int i=1;i<=n;i++){
if(col[i]==1||d1[r-i+n]==1||d2[r+i]==1) continue;
a[r]=i;
col[i]=d1[r-i+n]=d2[r+i]=1;
dfs(r+1);
a[r]=col[i]=d1[r-i+n]=d2[r+i]=0;
}
主函数就不用我多说了,代码见下
int main(){
cin>>n;
dfs(1);
cout<<ans;
return 0;
}
这道题就这样结束了