不打表会超时……条件vis[curr]==vis[j]||curr-vis[curr]==j-vis[j]||curr+vis[curr]==j+vis[j]判断皇后(curr,vis[curr])和(j,vis[j])是否会在同一条对角线上
#include<bits/stdc++.h> using namespace std; int n,ans,vis[15]; void dfs(int curr) { if(curr==n) ans++; else { for(int i=0;i<n;i++) { int ok=1; vis[curr]=i; for(int j=0;j<curr;j++) { if(vis[curr]==vis[j]||curr-vis[curr]==j-vis[j]||curr+vis[curr]==j+vis[j]) { ok=0; break; } } if(ok) dfs(curr+1); } } } int main() { int cnt[11]; for(int i=1;i<=10;i++) { ans=0; n=i; memset(vis,0,sizeof(vis)); dfs(0); cnt[i]=ans; } while(scanf("%d",&n)==1&&n) { printf("%d\n",cnt[n]); } return 0; }