八皇后问题(递归)

来源:互联网 发布:微博用户数据 编辑:程序博客网 时间:2024/06/05 02:15

问题描述

       八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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;}
0 0
原创粉丝点击