题解:
思路:回溯,搜索,标记。
具体如下图代码
(解释得很清晰,有疑问可以私信,也欢迎大家指出错误)
#include<bits/stdc++.h>
using namespace std;
int s,a[40],b[40],c[40],d[40],n; //数组内可取大些
//a表示行,b是列,c是从左下到右上,d是从左上到右下;
void printf()
{ s++; //总数++
if(s<=3) //只输出前三个
{ for(int i=1;i<=n;i++) //n=6时,代表6行
cout<<a[i]<<" ";cout<<endl;
}
}
void search(int i)
{
for(int j=1;j<=n;j++) //从第一列开始
if(b[j]==0&&c[i+j]==0&&d[i-j+n]==0) //从左下到右上,如果在同一条对角线上,则i+j的和是不变的
// 从左上到右下,如果在同一条对角线上,则i-j+n的值是不变的
{
a[i]=j; //如果n=6,因为要求输出的是列数,行数已经默认为123456,故=j;
b[j]=1;c[i+j]=1;d[i-j+n]=1; //标记为1
if(i==n) printf(); //如果n=6,123456,6行都已经遍历过,则输出;
else
search(i+1); //没有那就下一行
b[j]=0;c[i+j]=0;d[i-j+n]=0; //n行遍历完,全设为未标记过,开始新的一次统计
}
}
int main()
{ cin>>n;
search(1); //搜索 ,从第一行开始
cout<<s<<endl;
return 0;
}