標籤:
八皇后問題是一個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出:在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
回溯法詳解請參考連結http://baike.baidu.com/view/6056523.htm
下面的C代碼可以解決N皇后問題,8皇后問題的解是92。
#include <stdio.h>#include <stdlib.h> #define max 8 int queen[max], sum=0; /* max為棋盤最大座標 */ void show() /* 輸出所有皇后的座標 */{ int i; for(i = 0; i < max; i++) { printf("(%d,%d) ", i, queen[i]); } printf("\n"); sum++;} int check(int n) /* 檢查當前列能否放置皇后 */{ int i; for(i = 0; i < n; i++) /* 檢查橫排和對角線上是否可以放置皇后 */ { if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i)) { return 1; } } return 0;} void put(int n) /* 回溯嘗試皇后位置,n為橫座標 */{ int i; for(i = 0; i < max; i++) { queen[n] = i; /* 將皇后擺到當前迴圈到的位置 */ if(!check(n)) { if(n == max - 1) { show(); /* 如果全部擺好,則輸出所有皇后的座標 */ } else { put(n + 1); /* 否則繼續擺放下一個皇后 */ } } }} int main(){ put(0); /* 從橫座標為0開始依次嘗試 */ printf("%d", sum); return 0;}程式運行部分結果:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
八皇后問題(C語言版本)