注意打表,不然超时!!!
#include <stdio.h>
#include <cmath>
using namespace std;
const int N=12;
int map[N],cnt;
bool check(int x,int y){
for(int i=1;i<x;i++){
if(map[i]==y||abs(x-i)==abs(map[i]-y))
return false;
}
return true;
}
void dfs(int x,int m){
if(x>m){
++cnt;
return;
}
for(int i=1;i<=m;i++){
if(check(x,i)){
map[x]=i;
dfs(x+1,m);
}
}
return;
}
int main(){
int i,ans[11];
for(i=1;i<11;i++){
cnt=0;
dfs(1,i);
ans[i]=cnt;
}
while(scanf("%d",&i)){
if(i==0)
return 0;
printf("%d\n",ans[i]);
}
return 0;
}