【递归】N皇后问题
题目描述:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。输入一个正整数N,则程序输出N皇后问题的全部摆法。输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n则代表第i行的皇后应该放在第n列,皇后的行列编号都是从1开始的。
输入:
4
输出:
2 4 1 3
3 1 4 2
思路:
如果N是确定的话,就用N重循环,但是现在N是不确定的所以可以用递归的方法,遍历棋盘的每个位置,判断是否符合题意。
代码:
#include <iostream> #include <stdlib.h> using namespace std; int N; int queuee[100]; //假设k-1行都排完了 void digui(int k){ if(k==N){//临界条件,递归到N行就输出 for(int i=0;i<N;i++){ cout<<queuee[i]+1; if(i<N-1){ cout<<' '; } } cout<<endl; return ; } //i:列,j:行 for(int i=0;i<N;i++){//逐个尝试k行的位置 int j; for(j=0;j<k;j++){ //如果和前边的k-1行同列,或处在对角线上则该位置不符合要求 if(queuee[j]==i||abs(queuee[j]-i)==abs(k-j)) break; } if(j==k){ queuee[k]=i; digui(k+1); } } } int main() { cin>>N; digui(0); return 0; }
祝你早日攒够失望,然后开始新的生活。