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;
    }
  • 相关阅读:
    Jenkins自动化部署入门详细教程
    单元测试
    弱网测试
    Token、Cookie和Session
    测试开发人员必备Linux命令
    TestNG(一)
    char和varchar
    你平时会看日志吗,一般会出现哪些异常(Exception)
    内存溢出和内存泄漏的区别,产生原因以及解决方案
    测试一个电梯
  • 原文地址:https://www.cnblogs.com/topk/p/6580099.html
Copyright © 2011-2022 走看看