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,求出有多少种合法的放置方法。
你的任务是,对于给定的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; }
posted on 2012-10-06 15:36 NewPanderKing 阅读(2587) 评论(0) 编辑 收藏 举报