首先在b站上学习了一位巨巨的讲解dfs&bfs虽然还是不太懂bfs,但dfs应该没问题了。(个人认为dfs比较重要的一个是回溯)
这道题主要的点我觉得在于如何判断列,主对角线,副对角线是否有棋子占用(开一个数组来判断这个方法本蒟蒻理解了好长时间。。)
#include<cstdio>
int qipan[3][100]={0},pos[13],n,count=0;
void dfs(int cur)
{
if(cur==n)
{
int first=1;
if(count<3)
{
for(int i=0;i<n;i++)
{
if(first) first=0;
else printf(" ");
printf("%d",pos[i]);
}
printf("\n");
}
count++;
}
else
{
for(int i=1;i<=n;i++)
{
if(!qipan[0][i] && !qipan[1][i+cur] &&!qipan[2][cur-i+n])
{
pos[cur]=i;
qipan[0][i]=1;
qipan[1][i+cur]=1;
qipan[2][cur-i+n]=1;
dfs(cur+1);
qipan[0][i]=0;
qipan[1][i+cur]=0;
qipan[2][cur-i+n]=0;
}
}
}
}
int main()
{
scanf("%d",&n);
dfs(0);
printf("%d",count);
return 0;
}