八皇后问题

今天看到的个题目:

<八皇后问题>

在8x8的国际象棋上摆放八个皇后,使其不能互相攻击,即任意的两个皇后不能处于同一行,同一列或同一斜线上.问有多少中摆放方法.

于是就自己写了下,用到个链表和递归:

#include <iostream>

using namespace std;



#define QNUM 8



typedef struct Queen {

    int x;

    int y;

    struct Queen* next;

}QNode;



QNode* head = NULL;

int g_num = 0;



void EightQueen(QNode*& pq, int row) {

    if (row > QNUM)

        return;

    pq = new QNode;

    pq->x = row;

    pq->next = NULL;

    for (int col=1; col<=QNUM; col++) {

        pq->y = col;      

        QNode* tmp = head;

        int flag = 0;

        while(tmp != pq) { //遍历不是自己之前所有的皇后,做比较

            if (pq->y == tmp->y) { //同一列

                flag = 1;

                break;

            }

            if (tmp->y - pq->y == tmp->x - pq->x) { //同一正斜线

                flag = 1;

                break;

            }

            if (tmp->y - pq->y == -(tmp->x - pq->x)) { //同一反斜线

                flag = 1;

                break;

            }

            tmp = tmp->next;

        }

        if (flag)

            continue;

        if (row == QNUM) { //计数

            g_num++;

        }

        EightQueen(pq->next, row+1); //递归

    }

    delete pq;

}



int main(void)

{

    int row = 1;

    EightQueen(head, row);

    cout << g_num << endl;

    return 0;

}

92种.

后来上网查了下,貌似是啥回溯法,有空去看看~

 

你可能感兴趣的:(八皇后)