zoukankan      html  css  js  c++  java
  • 【递归】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;
    }
    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    代理模式
    适配器模式
    策略模式
    原型模式
    内存溢出
    jvm常用参数
    单例模式
    抽象工厂
    工厂方法模式
    选择器代码
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7199955.html
Copyright © 2011-2022 走看看