八皇后問題
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。
思路:
利用回溯法解決
1.建立乙個全域性變數的二維陣列chess;並初始化全為0。陣列中1為皇后,0為空位置。
2.一行一行開始放皇后;放皇后之前檢查是否適合,若存在相互攻擊,則皇后向右移一列,若位置適合,進行下一行皇后的放置(遞迴)
3.到達最後一行的時候在合適的位置開始計數。
輸出結果:總共有92種方案。#include
using
namespace std;
#define n 8
//可以根據n來修改棋盤的格數
int cnt =0;
//設定乙個計數器
int chess[n]
[n]=
;//用於存放棋盤的二維陣列
void
print()
//列印函式
printf
("\n");
}printf
("*****************************************\n");
}//判斷放置的位置是否符合要求
//返回0 表示存在互吃
//返回1 表示正常
intcheck
(int i,
int j)
//同一行
for(k =
0; k
)//左斜上
s = i-
1;k = j-1;
while
(s>=
0&&k>=0)
//右斜上
s = i-
1;k = j+1;
while
(s>=
0&&k
return1;
}//演算法主體
void
queen
(int i,
int j)if(
(i==
(n-1))
)//最後一行
}//不符合,置零,右移
chess[i]
[j]=0;
queen
(i,j+1)
;}intmain()
C C 回溯經典演算法之 八皇后問題
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...
經典回溯演算法 八皇后問題
八皇后問題是由19世紀數學家 搞死先生 高斯先生 提出的,具體的問題是這樣的 在西洋棋的棋盤中 有8 8格 擺放 8個皇后,這八個皇后不能相互攻擊到 皇后的攻擊方向很廣 橫著,豎著,斜著都能攻擊 即 8個皇后不能處於同行 同列 同一正反對角線上,這樣就不能相互攻擊到了。那麼,這樣的皇后佔位的方法,一...
經典回溯演算法(八皇后問題)
今天偶爾看到了乙個演算法問題 八皇后問題 回想一下還是在演算法課上學習過的,於是,自己總結了一下,寫了這篇日誌 演算法提出 在西洋棋棋盤上 8 8 放置八個皇后,使得任意兩個皇后之間不能在同一行,同一列,也不能位於同於對角線上。問共有多少種不同的方法,並且指出各種不同的放法。演算法思路 首先我們分析...