N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5563 Accepted Submission(s): 2518
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#include<iostream> using namespace std; #include"stdio.h" #define MAX 12 int vst[MAX]; int cnt[MAX]; int ans; int n; bool flag; //vst[i] 表示第i个皇后的列数 //ans 存放的是当前方案的个数,用于复制给ans[i],n表示皇后循环个数的变量 //flag用来表示该位置能不能放皇后,能的话就为true void DFS(int row) //深搜 { int i,j; if(row==n+1) //如果所放皇后个数大于要求个数n,则该方案可行,ans+1 ans++; else for(i=1;i<=n;i++) //该皇后之前的也需要进行循环,先选定一个位置看下面能放几个,如果不够,这个也要换 { flag=true; vst[row]=i; for(j=1;j<row;j++) //将该皇后之前的各个皇后都与之进行比较,看是否满足条件 { if(vst[row]==vst[j]||vst[row]-row==vst[j]-j||vst[row]+row==vst[j]+j) // { //如果在同一斜线或同一列就不能放 flag=false; break; } } if(flag) DFS(row+1); // 如果能放,考虑放置下一个皇后,row+1 } } int main() { int i; for(n=1;n<11;n++)//´从1~10先算出各个方案,下面直接输出 { ans=0; DFS(1); //每次都是从1开始搜索 cnt[n]=ans;// cnt[i]表示放i个皇后的可行方案个数 } while(scanf("%d",&n)!=EOF&&n) { printf("%d\n",cnt[n]); } return 0; }