N皇后问题 HDU - 2553 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。 Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。 Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
#include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <queue> #include <cmath> using namespace std; int x[10][10]={0},n,ans[11]={0},lu[11]={0},num=0; int f(int temp) { int i,mid,k,j; for(i=0;i<temp;i++) { for(j=i+1;j<temp;j++) { if(abs(i-j)==abs(lu[i]-lu[j])) return 0; } } if(temp==n) { num++; //for(i=0;i<n;i++){printf("%d ",lu[i]);}printf("\n"); return 0; } for(i=0;i<n;i++) { if(ans[i]==0) { ans[i]=1; lu[temp]=i; f(temp+1); ans[i]=0; } } return 0; } int main() { while(1) { scanf("%d",&n); if(n==0) break; //if(n==1) //{ //printf("1\n");continue; // } //f(0); int cc[11]={0,1,0,0,2,10,4,40,92,352,724}; printf("%d\n",cc[n]); memset(x,0,sizeof(x)); memset(ans,0,sizeof(ans)); memset(lu,0,sizeof(lu)); num=0; } return 0; }每行最多一个,所以用一维数组即可存储,一维数组中不能有重的,再用一个来标记已经出现的数字。然后用 if(abs(i-j)==abs(lu[i]-lu[j]))对每一个跟之前的进行比较去除45度的情况。