题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
题记:典型的dfs问题。
#include<bits/stdc++.h>
using namespace std;
int n,tot=0;
int col[12]={0};
bool check(int c,int r){
for(int i=0;i<r;i++)
if(col[i]==c||(abs(col[i]-c)==abs(i-r)))
return false;
return true;
}
void dfs(int r){//一行一行得放皇后,r表示第r行
if(r==n){//所有皇后都放好了,递归返回
tot++;//统计合法的棋局个数
return;
}
for(int c=0;c<n;c++)//在每一列放皇后
if(check(c,r)){
col[r]=c;
dfs(r+1);
}
}
int main(){
int ans[12]={0};
for(n=0;n<=10;n++){//n最大为10,把n从一到十的情况打表
memset(col,0,sizeof(col));
tot=0;
dfs(0);
ans[n]=tot;//打表
}
while(cin>>n){
if(n==0)
return 0;
cout<<ans[n]<<endl;
}
return 0;
}