似曾相识 不过是个Bug...

大狗的窝~

八皇后问题

今天看到的个题目:

<八皇后问题>

在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种.

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

 

posted on 2012-10-06 14:57  Mr.DejaVu  阅读(199)  评论(0编辑  收藏  举报

导航

for myself...