这道题很明显就是用深度优先搜索,也就是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; }
这道题就这样结束了