代码改变世界

八皇后

2016-09-21 21:50  这里是陆陆  阅读(127)  评论(0编辑  收藏  举报
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。而且仅当 n = 1 或 n ≥ 4 时问题有解。

#include<iostream>

using namespace std;

static int gEightQueen[8] = { 0 }, gCount = 0;

void print()//输出每一种情况下棋盘中皇后的摆放情况

  for (int i = 0; i < 8; i++)

    {   

        int inner;

        for (inner = 0; inner < gEightQueen[i]; inner++)

            cout << " ";

        for (inner = gEightQueen[i] + 1; inner < 8; inner++)

            cout << "";

        cout <<"#" << endl;

    }

    cout << "==========================\n";

}

int check_pos_valid(int loop, int value)//检查是否存在有多个皇后在同一行/列/对角线的情况

{

    int index;

    int data;

    for (index = 0; index < loop; index++)

    {

        data = gEightQueen[index];

        if (value == data)

            return 0;

        if ((index + data) == (loop + value))

            return 0;

        if ((index - data) == (loop - value))

            return 0;

    }

    return 1;

}

void eight_queen(int index)

{

    int loop;

    for (loop = 0; loop < 8; loop++)

    {

        if (check_pos_valid(index, loop))

        {

            gEightQueen[index] = loop;

            if (7 == index)

            {

                gCount++, print();

                gEightQueen[index] = 0;

                return;

            }

            eight_queen(index + 1);

            gEightQueen[index] = 0;

        }

    }

}

int main(int argc, char*argv[])

{

    eight_queen(0);

    cout << "total=" << gCount << endl;

    return 0;

}