八皇后问题(递归)

问题描述

       八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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;
}
posted @ 2016-10-04 10:09  zq216991  阅读(172)  评论(0编辑  收藏  举报