本文共 1771 字,大约阅读时间需要 5 分钟。
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3730 Accepted Submission(s): 1737
/**n皇后问题,由于N 是小于等于10的正整数,所以可以使用打表的方法把前十中情况全部找出来存起来然后每次输入时不用重新的计算了。*/#include#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;}
本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/archive/2012/10/06/2713013.html ,如需转载请自行联系原作者