1. 程式人生 > >回溯法解決八皇后(c++)

回溯法解決八皇后(c++)

八皇后問題是一個以國際象棋為背景的問題:如何能夠在 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;
}