問題分析
1、問題解向量(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8])
陣列下標i表示皇后所在行號
陣列元素x[i]表示皇后所在列號
2、約束條件
皇后不能同行,這裡設的一維陣列的表示,就顯示約束了每行只能有乙個皇后:x[i]=1,2,…,n
隱約束1:任意兩個皇后不同列:x[i]!=x[j];
隱約束2:任意兩個皇后不處於同一對角線:|i-j|!=|x[i]-x[j]|
3、思路
從棋盤第一行第一列、第二列依次放皇后,放乙個皇后之後到棋盤下一行找符合條件的位置找到之後放皇后(在陣列中記錄皇后位置),然後再跳到下一行找相應的位置,每一次遍歷所在行的所有列,找到符合條件的,最終如果在第8行找到了相應的放皇后的位置,那麼說明找到乙個解向量。
演算法複雜度為o(n^3)。
實現**
#include "stdafx.h"#include #include /**
*八皇后問題
*陣列下標1-8表示,棋盤的第幾行
*陣列值x[i],表示棋盤的第幾列
*從第一行第一列開始找,設其為皇后所在位,根據邊界條件
*/int x[9];//這裡從下標1開始方便理解
int sum = 0;
void output(int arr);
int main();
bool bound(int k)
} return true;
}void backtrack(int t)
else }
}void output(int arr)
}int main()
八皇后問題
八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...
八皇后問題
include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...
八皇后問題
package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...