【递归】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;
}

 

posted @ 2017-07-19 08:50  路人姜。  阅读(214)  评论(0编辑  收藏  举报