zoukankan      html  css  js  c++  java
  • N个皇后 (递归)

     N皇后问题
    输入一个正整数N,则程序输出N皇后问题的全部摆法。
    输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。
    皇后的行、列编号都是从1开始算。
    样例输入:
    4
    样例输出:
    2413
    3142 

    嘿嘿๑乛◡乛๑
    先说一下递归的作用:
    1.替代多重循环
    2.解决本来就是递归形式定义的问题
    3.将问题分解为规模更小的子问题进行求解

    而这里8个皇后就是用来递归代替多重循环
    从第0行开始摆放,如果该方案没有冲突,则继续摆放下一行,递归结束标志是N行全部摆完,输出其中一个结果。

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int N;
    int queenPos[100];
    
    
    void NQueen(int k);
    
    int main()
    {
        cin>>N;
        NQueen(0);//从第0行开始摆放皇后
        return 0;
    }
    
    void NQueen(int k)
    {
        if(k==N) //N个皇后已经摆好
        {
            for(int i=0; i<N; i++)
                cout<<queenPos[i]+1<<" ";
            cout<<endl;
            return;
        }
    
        int i,j;
        for(i=0; i<N; i++) //尝试当前行的每一列,看是否能放置皇后
        {
            for(j=0; j<k; j++) //和已摆好的k个皇后进行比较
            {
                /*
                1皇后在同一列,即  queePos[j]==i
                2皇后在对角线上,则 行的差的绝对值=列的差的绝对值 即 abs(k-j)==abs(queenPos[j]-i)
                */
                if(queenPos[j]==i || abs(k-j)==abs(queenPos[j]-i))
                    break;// 冲突,测试下一个位置
            }
    
            if(j==k) //上一个循环没有执行break,当前位置i不冲突
            {
                queenPos[k]=i; // 记录下第k个皇后摆放位置i
                NQueen(k+1);
            }
        }
    }
    


  • 相关阅读:
    异步与同步,阻塞与非阻塞的正确认识
    Go 环境配置
    使用node.js 脚手架搭建Vue项目
    使用HBuilder+MUI+Flask后端服务器框架+Mongodb数据库开发手机APP
    基于百度API+Flask实现网页版和图灵机器聊天
    人工智能-调百度AI接口+图灵机器人
    日期显示格式的修改
    salt软件远程控制服务器
    Django
    孙鑫MFC学习笔记14:网络编程
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746111.html
Copyright © 2011-2022 走看看