八皇后问题
今天看到的个题目:
<八皇后问题>
在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种.
后来上网查了下,貌似是啥回溯法,有空去看看~