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,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1850
Sample Output
19210
/**
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;
}