hdu2553

dfs一直往下搜索,每次chack一下是否满足要求,即可

代码如下:

#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn=30; int vis[maxn];//记录每行点的纵坐标  int a[20]; int ans; int n,m; bool chack(int a,int b) {
    for(int i=1;i<a;i++)
    {
        if(vis[i]==b||abs(a-i)==abs(vis[i]-b))//判断与该行之前的点的纵坐标是否相等和45度角              return 0;
    }
    return 1;
} void dfs(int x,int y) {
    if(x>m)
    {
         ans++;
         return;
        
    }
    for(int i=1;i<=m;i++)
    {
        if(chack(x,i))
        {
            vis[x]=i;
            dfs(x+1,1);
        }
    }
} int main() {
    for(int i=1;i<=10;i++)
    {
        m=i;
        ans=0;
        dfs(1,1); //        printf("ans : %d\n",ans);         a[i]=ans;
    }
    while(scanf("%d",&n)!=EOF)
    {
        if(!n)
            break;
        printf("%d\n",a[n]);
    }
    return 0;
}