hdu2553(N皇后问题)

点击打开链接

Problem Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input

    
    
    
    
1 8 5 0
 

Sample Output

    
    
    
    
1 92 10

#include <stdio.h>
#include <string.h>
int map[15][15],n,count;//d[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int AC(int x,int y)
{
    int i,j,sign,k;
    i=x;j=y;
    sign=1;
    if(map[x][y]==1)
    return 0;
    for(k=1;j+k<=n;k++)
    if(map[i][j+k]==1){sign=0; break;}//右方向
    for(k=1;j-k>=1;k++)
    if(map[i][j-k]==1){sign=0;break;}//左方向
    for(k=1;i-k>=1;k++)
    if(map[i-k][j]==1){sign=0;break;}//上方向
    for(k=1;i+k<=n;k++)
    if(map[i+k][j]==1){sign=0;break;}//下方向
    for(k=1;i+k<=n&&j+k<=n;k++)
    if(map[i+k][j+k]==1){sign=0;break;}//右下方向
    for(k=1;i+k<=n&&j-k>=1;k++)
    if(map[i+k][j-k]==1){sign=0;break;}//右上方向
    for(k=1;i-k>=1&&j+k<=n;k++)
    if(map[i-k][j+k]==1){sign=0;break;}//左下方向
    for(k=1;i-k>=1&&j-k>=1;k++)
    if(map[i-k][j-k]==1){sign=0;break;}//左上方向
    return sign;
}
void DFS(int i)
{
    int j;
    if(i>n)
    {
        count++;
        return ;
    }
    for(j=1;j<=n;j++)
    if(AC(i,j))
    {
        map[i][j]=1;
        DFS(i+1);
        map[i][j]=0;
    }
}
int main()
{
    int i,m,aa[15];
    for(n=1;n<=10;n++)
    {
        count=0;
        memset(map,0,sizeof(map));
        DFS(1);
        aa[n]=count;
    }
    //for(i=1;i<=10;i++)
    //printf("%d ",aa[i]);
    while(scanf("%d",&m)!=EOF&&m!=0)
    {
        printf("%d\n",aa[m]);
    }
    return 0;
}




你可能感兴趣的:(hdu2553(N皇后问题))