N皇后问题
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 18 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 9210
#include <stdio.h> #include <iostream> #include <cmath> using namespace std; int sum,x[11]; int n; bool place(int k) { for(int i=1;i<k;i++) { if(abs(x[i]-x[k])==abs(k-i)||x[i]==x[k]) { return false; } } return true; } void backtrack(int k) { if(k>n) sum++; else { for(int i=1;i<=n;i++) { x[k]=i; if(place(k)) { backtrack(k+1); } } } } int main() { int ans[11]; for(n=1;n<11;n++) { sum=0; backtrack(1); ans[n]=sum; } while(scanf("%d",&n)!=EOF&&n) { printf("%d",ans[n]); cout<<endl; } return 0; }