zoukankan      html  css  js  c++  java
  • 八皇后问题(递归)

    问题描述

           八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法.

    思路

           本题采用回溯递归求解,从第一行开始选择摆放位置,这样就避免了横向冲突,然后每次放置皇后只要检验是否存在纵向冲突或斜向冲突。

    code

    #include <iostream>
    using namespace std;
    
    const int n = 8;
    
    int result[10];
    int cnt;
    
    void slove(int cur)
    {
    
        if(cur == n)
        {
            //打印结果
            cout << "#" << cnt ++ << ": "; 
            for(int i = 0; i < n; i ++)
            {
                cout << "(" << i << ", " << result[i] << ") ";
            }
            cout << endl;
        }
        else
        {
            for(int i = 0; i < n; i ++)
            {
                //选择在第cur行第列放置
                result[cur] = i;
                bool ok = true;
                for(int j = 0; j < cur; j ++)
                {
                    //检测是否与之前放置的皇后存在斜向或者纵向冲突
                    if(result[cur]-result[j] == cur-j || result[j]-result[cur] == cur-j || result[cur] == result[j] )
                    {
                        ok = false;
                        break;
                    } 
                }
                if(ok)
                {
                    //没冲突时递归向下一行求解
                    slove(cur+1);
                }
            }
    
        }
    }
    
    int main()
    {
        slove(0);
        return 0;
    }
  • 相关阅读:
    JAVA-类加载机制(2)-类加载的过程
    JAVA-类加载机制(1)-生命周期
    StarUML-详解
    JMS-mq-发布/订阅
    JMS-mq-点对点
    Spring-Transcation
    Session-Hibernate
    Session
    Git配置
    Maven配置
  • 原文地址:https://www.cnblogs.com/topk/p/6580099.html
Copyright © 2011-2022 走看看