hdu 2553 N皇后问题(深度递归搜索)

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3730    Accepted Submission(s): 1737


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
/**
n皇后问题,由于N 是小于等于10的正整数,
所以可以使用打表的方法把前十中情况全
部找出来存起来然后每次输入时不用重新
的计算了。
*/
#include <stdio.h>

#define NUMS 10
/*输入的数字1---10*/
int N;
/*棋盘*/
int chessboard[11][11];
/* 用来记录拜访数目 */
int cal;

/*
检查皇后放置此行此列是否可以,可以返回1,不可以返回0
此递归是一行一行找的,K是棋盘的长度
*/
int dfs_check(int row,int column,int k)
{
    /* 说明已经到了棋盘的界外,前边都符合了 */
    if(row>k)
    {
        cal++;
        return 1;
    }
    /* 正上方是否有皇后*/
    for(int i = 1; i < row; i++)
        /* 如果有皇后则返回不能放置这里返回0*/
    if(chessboard[i][column] == 1)
    return 0;

    /* 左右上方45度角检查是否可以*/
    /* 左上方*/
    for(int i=row-1,j=column-1;i>0&&j>0;i--,j--)
    if(chessboard[i][j] == 1)
    return 0;
    /* 右上方*/
    for(int i=row-1,j=column+1;i>0&&j<=k;i--,j++)
    if(chessboard[i][j] == 1)
    return 0;
    /*标记这个位置成功了*/
    chessboard[row][column] = 1;

    /*进行下一行搜索*/
    for(int i=1;i<=k;i++)
    if(dfs_check(row+1,i,k)==1)
    break;

    chessboard[row][column] = 0;
    return 0;
}


int main()
{
    int i,j,k;
    int count[11];
    /*打表*/
    for(k=1;k<=NUMS;k++)
    {
        count[k] = 0;
        cal = 0;
        /*首先将棋盘初始化全部置为0*/
        for(i=0;i<=NUMS;i++)
        for(j=0;j<=NUMS;j++)
        chessboard[i][j]=0;
        for(i=1;i<=k;i++)
        dfs_check(1,i,k);
        count[k] = cal;
    }

    while(scanf("%d",&N)!=EOF&&N!=0)
    printf("%d\n",count[N]);
    return 0;
}
原文地址:https://www.cnblogs.com/newpanderking/p/2713013.html