N皇后问题
2012-03-04 18:31
281 查看
Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
处理回溯问题,以及要在循环输入之前进行筛。
View Code
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
处理回溯问题,以及要在循环输入之前进行筛。
View Code
#include<stdio.h> #include<stdlib.h> #include<math.h> int x[11], N, sum; bool judge( int k )//判断是否可以加入 { for( int i = 1; i < k; i++ ) { if( x[i] == x[k] || abs(k-i) == abs(x[k] - x[i]) ) return false; } return true; } void dfs( int k )//回溯,K初值为1 { if( k > N )//安排完后,sum++ sum++; else { for( int i = 1; i <= N; i++ )//第K个皇后的列坐标 { x[k] = i; if( judge( k ) ) { dfs( k+1 ); } } } } int main() { int ans[11]; for( N = 1; N <= 10; N++ ) { sum = 0; dfs(1); ans = sum; }//预处理 while( scanf( "%d", &N )!=EOF &&N ) { printf( "%d\n", ans ); } return 0; }
相关文章推荐
- SICP_Python第二章:映射(子集问题,排列问题,N皇后问题)
- HDU 2553 N皇后问题
- HDU_2553——n皇后问题,作弊
- n皇后问题(C++解决)
- 2n皇后问题
- 编程练习:N皇后问题 (JAVA)
- 【C++】n皇后问题
- 杭电2553之n皇后问题
- n皇后问题
- 算法竞赛入门经典第七章暴力求解法——回溯法(1.八皇后问题)
- N皇后问题 HDU - 2553
- N皇后问题(N queen‘s problem)
- N皇后问题 回溯法
- N皇后问题的一般解法--回溯法
- hdu2553 N皇后问题--DFS
- n皇后问题位运算
- 2n皇后问题
- N皇后问题的两个最高效的算法
- HDU 2553 N皇后问题
- 7.4.1八皇后问题(经典回溯法)