...就是N皇后
输出前三种可能排序
输出所有可能排序的方法数
vis[0][i]为i点是否已用
vis[1][m+i]为i点副对角线是否已用 m+i 为从左至右第 m+i 条副对角线
vis[1][m+n-i]为i点主对角线是否已用 m+n-i 为从右至左第 m+n-i 条主对角线
#include<iostream> #include<algorithm> #include<stdio.h> #include<cstring> #include<math.h> using namespace std; int n,cnt; int ans[100],vis[5][50]; void DFS(int m) { if(m==n+1) { cnt++; if(cnt<=3) { for(int i=1;i<n;i++) printf("%d ",ans[i]); printf("%d ",ans[n]); } return ; } for(int i=1;i<=n;i++) { if(!vis[0][i]&&!vis[1][m+i]&&!vis[2][m-i+n]) { vis[0][i]=vis[1][m+i]=vis[2][m-i+n]=1; ans[m]=i; DFS(m+1); vis[0][i]=vis[1][m+i]=vis[2][m-i+n]=0; } } } int main() { while(~scanf("%d",&n)) { memset(ans,0,sizeof(ans)); cnt=0; DFS(1); printf("%d ",cnt); } return 0; }