1. 程式人生 > >回溯經典演算法之四皇后問題

回溯經典演算法之四皇后問題

1.問題概述:在一個4*4的方格中住著四個皇后,他們之間都不友好,相鄰就會打架,現在要進行查詢能夠滿足:每行每列每個斜線都只有一個皇后,才能沒有打架發生

2.思路:

這裡需要這樣進行查詢,第一個皇后先在第一行第一列開始假定位置,然後第二行第二個皇后滿足條件來擺放,如果到後面有皇后不能放在能滿足條件地方了時就回到她的前一個皇后並換一個地方,或者在前一個。。。就這樣,最後得到了結果是2413

定義一個數組a[5],a[i]=j表示第i個皇后放在第i行第j列

這個問題主要是確定三個:陣列元素的初始值、取值點和回溯點;

1.如何判斷當前位置的取值滿足條件:
    假設一個flag變數,每次設值都與前面已經設定好了的皇后的位置進行比較,是否同行同列,同斜線可以使用表示式:a[i]
=a[j]=i-j||a[i]-a[j]=j-i 2.什麼情況下成功找到四皇后的擺放位置: 當flag=1並且i=4,也就是當前設值的位置已經是最後一個皇后了並且設定的位置也能滿足條件 3.什麼情況下四個皇后還沒有全部確定完,還需要進行查詢下一個: 當flag=1並且i<4時,這時候還有皇后沒有確定位置,還需要進行查詢 4.什麼情況下進行回溯: 當flag=0時並且a[i]=4並且i>1時,flag=0表示當前位置的值不能滿足,a[i]=4表示當前位置所有的值都設定過了仍然沒有滿足條件的,i>1表示還可以進行回溯,如果i=1時表示它是第一個皇后,就沒有進行回溯的物件了,那程式就可以終止了 5.
什麼情況下探索完畢,程式終止: 當a[i]=4並且i=1時,已經沒有回溯的物件了,這時候程式就終止了

3.實現程式碼:

//四皇后問題實現程式碼
    public static void queen(){

        int i=1;
        int a[] = new int[5];
        //初始化第一行第一列放第一個皇后
        a[i] = 1;
        while(true){
            //判斷當前位置假定的值是否重複
            int g = 1;
            for(int j=1; j<i; j++){
                if
(a[i] == a[j] || a[i]-a[j] == i-j || a[i]-a[j] == j-i){ g = 0; break; } } //已找到結果時輸出 if(g == 1 && i == 4){ for(int x=1; x<=4; x++){ System.out.print(a[x]); } System.out.println(); break; } //當前滿足條件但是四個皇后還沒排完 if(g == 1 && i < 4){ a[++i] = 1; continue; } //回溯的條件 while(a[i] == 4 && i > 1) i--; //回溯的終點 if(i == 1 && a[i] == 4){ break; } else{ a[i]++; } } }

相關推薦

回溯經典演算法皇后問題

1.問題概述:在一個4*4的方格中住著四個皇后,他們之間都不友好,相鄰就會打架,現在要進行查詢能夠滿足:每行每列每個斜線都只有一個皇后,才能沒有打架發生 2.思路: 這裡需要這樣進行查詢,第一個

【C/C++】回溯經典演算法-->八皇后問題

一、八皇后問題 八皇后問題,是一個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。

經典回溯演算法n皇后問題

這是來源於國際象棋的一個問題。n皇后問題要求在一個n×n格的棋盤上放置n個皇后,使得它們彼此不受攻擊。按照國際象棋的規則,一個皇后可以攻擊與之處在同一行或同一列或同一條斜線上的其他任何棋子。因此,n後問題等價於要求在一個n×n格的棋盤上放置n個皇后,使得任何兩個皇后不能被放

五大常用演算法回溯演算法

1、概念 回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。 回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重

【轉載】五大常用演算法回溯

本文轉自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html 1、概念       回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:視差計算、視差優化

文章目錄 視差計算 視差優化 剔除錯誤匹配 提高視差精度 抑制噪聲 視差計算   在SGM演算法中,視差計算採用贏家通吃(WTA)演算法,每個畫素選擇最小聚

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:代價聚合(Cost Aggregation)

  由於代價計算步驟只考慮了局部的相關性,對噪聲非常敏感,無法直接用來計算最優視差,所以SGM演算法通過代價聚合步驟,使聚合後的代價值能夠更準確的反應畫素之間的相關性,如圖1所示。聚合後的新的代價值儲存在與匹配代價空間C同樣大小的聚合代價空間S中,且元素位置一一對應。 圖1:代價聚合

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:匹配代價計算Census變換(Census Transform,CT)

  基於互資訊的匹配代價計算由於需要初始視差值,所以需要通過分層迭代的方式得到較為準確的匹配代價值,而且概率分佈計算稍顯複雜,這導致代價計算的效率並不高。學者Zabih和Woodfill 1 提出的基於Census變換法也被廣泛用於匹配代價計算。Census變換是使用畫素鄰域內的區域性灰

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:匹配代價計算互資訊(Mutual Information,MI)

  半全域性立體匹配演算法Semi-Global Matching,SGM由學者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的區域性演算法由於所基於的區域性視窗視差相同的假設在很多情況下並不成立導致匹配效果較差;而另一方面全域性演算法雖然通過二維相鄰畫素視差之間

Java中的經典演算法選擇排序(SelectionSort)

Java中的經典演算法之選擇排序(SelectionSort) 神話丿小王子的部落格主頁 a) 原理:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。基

遞迴演算法皇后

八皇后問題核心: 1:同一行或者同一列不能放置皇后; 2:斜率為1/-1的對角線上不能有兩個皇后。 如圖: 實現原理:     #include<iostream> #include<cstdio> using std::

Python3實現機器學習經典演算法)C4.5決策樹

一、C4.5決策樹概述   C4.5決策樹是ID3決策樹的改進演算法,它解決了ID3決策樹無法處理連續型資料的問題以及ID3決策樹在使用資訊增益劃分資料集的時候傾向於選擇屬性分支更多的屬性的問題。它的大部分流程和ID3決策樹是相同的或者相似的,可以參考我的上一篇部落格:https://www.cnblogs.

大資料探勘領域十大經典演算法—CART演算法(附程式碼)

簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CART假設決策樹是二叉樹,

機器學習十大經典演算法K-近鄰演算法(學習筆記)

演算法概述 K-近鄰演算法(k-Nearest Neighbor,KNN)是機器學習演算法中最簡單最容易理解的演算法。該演算法的思路是:給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的K個例項, 這K個例項的多數屬於某個類,就把該輸入例項分

資料探勘領域十大經典演算法—樸素貝葉斯演算法(超詳細附程式碼)

簡介 NaïveBayes演算法,又叫樸素貝葉斯演算法,樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。屬於監督學習的生成模型,實現簡單,沒有迭代,並有堅實的數學理論(即貝葉斯定理)作為支撐。在大量樣本下會有較好的表現,不適用於輸入向量的特徵條件有關聯的場景。 基本思想 (1)

資料探勘領域十大經典演算法—SVM演算法(超詳細附程式碼)

簡介 SVM(Support Vector Machine)中文名為支援向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來進行模式識別、分類以及迴歸分析。 相關概念 分類器:分類器就是給定一個樣本的資料,判定這個樣本屬於哪個類別的演算法。例如在股

機器學習十大經典演算法決策樹(學習筆記整理)

一、決策樹概述 決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。決策樹是一個預測模型,代表的是物件屬性與物件值之間的一種對映關係。 最初的節點稱為根節點(如圖中的"顏色"),有分支的節點稱為中間節點

演算法n皇后問題

1. 問題描述:在n×n的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n皇后問題等價於在n×n的棋盤上放置n個皇后,任何2個皇后不能放在同一行或同一列或同一斜線上。 2. 問題分析: 用n元陣列x[n]表示

經典演算法希爾排序(三種實現)

希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。 該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素

資料探勘十大經典演算法K-means 演算法

K-means演算法(非監督性學習) 1.演算法思想         k-means演算法是一種簡單的迭代型聚類演算法,採用距離作為相似性指標,從而發現給定資料集中的K個類,且每個類的中心是根據類中所有值的均值得到,每個類