回溯法解決八皇后(c++)
阿新 • • 發佈:2019-01-05
八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當 n2 ≥ 1 或 n1 ≥ 4 時問題有解。
八皇后問題最早是由國際西洋棋棋手馬克斯·貝瑟爾於1848年提出。之後陸續有數學家對其進行研究,其中包括高斯和康託,並且將其推廣為更一般的n皇后擺放問題。八皇后問題的第一個解是在1850年由弗朗茲·諾克給出的。諾克也是首先將問題推廣到更一般的n皇后擺放問題的人之一。1874年,S.岡德爾提出了一個通過行列式來求解的方法,這個方法後來又被J.W.L.格萊舍加以改進。
艾茲格·迪傑斯特拉在1972年用這個問題為例來說明他所謂結構性程式設計的能力。
八皇后問題出現在1990年代初期的著名電子遊戲第七訪客中。
#include <iostream> #include <vector> #include <cmath> using namespace std; int cnt=0,n=8; vector<int> c(100); bool issafe(vector<int> a,int row) { for(int i=0;i<row;i++){ if(a[i]==a[row]||abs(a[i]-a[row])==row-i)//a[i]表示列,i表示行 return false; } return true; } void search(int row) { if(row==n) cnt++; else{ for(int i=0;i<n;i++){ int ok=1; c[row]=i; //嘗試吧第row行的皇后放在第i列 if(!issafe(c, row)) ok=0;//檢查是否和前面的皇后衝突 if(ok) search(row+1);//如果合法,則繼續遞迴 } } } int main() { search(0); cout<<cnt<<endl; return 0; }