原题hdoj2553:
题目描述:在一个N×N的方格中放置N个皇后,使其不能出现在同一列同一行同一对角线上,求有多少种放置方法。
思路分析:由于任意两个皇后均不会出现在同一行中,所以可转换为一维求解。用一个一维数组记录每个皇后的所在的列,不在同一对角线的两个皇后i、j,即可可表示为A[i]-A[j]!=i-j或A[i]-A[j]!=j-i;
代码:
由于本这题时间卡的较紧,并n最大只能为10可打表记录
#include<iostream>
using namespace std;
int A[15],n,sum;
void dfs(int m){
int i,j;
if(m>n){
sum++; //m>n即枚举了一种放法,sum++
return;
}
for(i=1;i<=n;i++){ //枚举第m个皇后可在的列i,即A[m]的值
int ans=1;
for(j=1;j<m;j++){ //当前列i是否和前m-1个皇后冲突
if(m-j==i-A[j]||m-j==A[j]-i||A[j]==i) ans=0; //和前面任意一个在同一列同一对角线上,ans=0
}
if(ans){
A[m]=i;
dfs(m+1);
}
}
}
int main(){
int i,B[15];
for(n=1;n<=10;n++){
sum=0;
dfs(1);
B[n]=sum;
}
while(cin>>n){
if(n==0) break;
cout<<B[n]<<endl;
}
return 0;
}