国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

八皇后問題(回溯法)

這篇具有很好參考價值的文章主要介紹了八皇后問題(回溯法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

什么是八皇后

八皇后問題怎么解決?

什么是回溯法

回溯法的模板

八皇后問題的核心代碼

判斷皇后位置是否可行

總體實現(xiàn)代碼

每日一句:

種一棵樹的最好時間是十年前,其次是現(xiàn)在。


八皇后問題(回溯法)

什么是八皇后

八皇后問題(英文:Eight queens),是由國際西洋棋棋手馬克斯·貝瑟爾于1848年提出的問題,是回溯算法的典型案例。

問題表述為:在8×8格的國際象棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜志上不同的作者發(fā)表了40種不同的解,后來有人用圖論的方法解出92種結(jié)果。如果經(jīng)過±90度、±180度旋轉(zhuǎn),和對角線對稱變換的擺法看成一類,共有42類。八皇后問題(回溯法)

八皇后問題怎么解決?

八皇后的解決辦法有很多種,我們這里采取回溯法解決。

什么是回溯法

回溯法的處理思想類似于枚舉搜索,我們枚舉出每一種情況,然后在根據(jù)條件進行篩選,找到滿足期望的值。我們把求解過程分為多個階段,每個階段我們都會面臨一個十字路口,我們隨便找一條路,走不通后,就回到上一個十字路口,選擇另一個十字路口進行下一步,知道遍歷完整個枚舉情況。

回溯法的模板

在面臨較簡單的回溯問題是可以使用以下模板

void backtracking(參數(shù)) {
    if (終止條件) {
        存放結(jié)果;
        return;
    }

    for (選擇:本層集合中元素(樹中節(jié)點孩子的數(shù)量就是集合的大?。? {
        處理節(jié)點;
        backtracking(路徑,選擇列表); // 遞歸
        回溯,撤銷處理結(jié)果
    }
}

八皇后問題的核心代碼

int []Queen=new int[8];//存取皇后所在列的位置
    public void eightQueen(int row){

        if (row==8){//當(dāng)row等于8時說明八個皇后都放置好了
            printQueens(Queen);//打印八皇后
            return;
        }
        for (int column = 0; column < 8; column++) {
           if (isOk(row,column)){//這里判斷是否可以放在這個位置
               Queen[row]=column;//放置皇后
               eightQueen(row+1);
           }
        }
    }

?那么有小伙伴就迷惑了,八皇后不應(yīng)該是八行八列嗎,為什么數(shù)組只是一個一維數(shù)組。這里就用到了回溯法的思想,把八行八列分成了八行,每一行都獨立,而一維數(shù)組則只用來存取皇后的列坐標(biāo),行坐標(biāo)由數(shù)組的下標(biāo)代替。

判斷皇后位置是否可行

public boolean isOk(int row,int column){
        int leftup=column-1,rightup=column+1;
        for (int i = row-1; i >=0 ; --i) {
            if (Queen[i]==column) return false;//看垂直方向是否有皇后
            if (leftup>=0){
                if (Queen[i]==leftup) return false;//看左上角斜線是否有皇后
            }
            if (rightup<8){
                if (Queen[i]==rightup) return false;//看右上角斜線是否有皇后
            }
            --leftup;
            ++rightup;
        }
        return true;
    }

判斷位置可行的條件是,是否存在有皇后處在同一列,同一行(同一行的情況不存在,因為row一直加1),同一斜線。?

那么判斷同一列我們只要看一維數(shù)組中是否有值與將要放置的皇后的列一致,如果一致我們?yōu)榕袛鄁alse;

那么如何判斷是否在同一條斜線,

假設(shè)一個點A AA的坐標(biāo)是[ a , b ] [a,b][a,b],那么和該點在同一斜線上的點A 有四種,分別是
[ a + x , b + x ] 、 [ a ? x , b ? x ] 、 [ a + x , b ? x ] 、 [ a ? x , b + x ]?

而我們只考慮左右上角的位置是否存在同一條斜線,那么為什么不考慮下角是否存在呢,因為我們的皇后還沒排到左右下角,所以只考慮 [ a ? x , b + x ] 和[ a ? x , b ? x ]這兩種情況。

我們通過讓x等于1時來達到,當(dāng)處于同一斜線時,斜線分為四十五度,則行和列相等時,在同一斜線上,判斷為false.文章來源地址http://www.zghlxwxcb.cn/news/detail-405751.html

八皇后總體實現(xiàn)代碼

public static void main(String[] args) {
        Solution1 solution=new Solution1();
        solution.eightQueen(0);
    }
    int []Queen=new int[8];
    int count=0;
    public void eightQueen(int row){

        if (row==8){
            count++;
            printQueens(Queen);
            return;
        }
        for (int column = 0; column < 8; column++) {
           if (isOk(row,column)){

               Queen[row]=column;
               eightQueen(row+1);
           }
        }
    }
    public boolean isOk(int row,int column){
        int leftup=column-1,rightup=column+1;
        for (int i = row-1; i >=0 ; --i) {
            if (Queen[i]==column) return false;//看垂直方向是否有皇后
            if (leftup>=0){
                if (Queen[i]==leftup) return false;//看左上角斜線是否有皇后
            }
            if (rightup<8){
                if (Queen[i]==rightup) return false;//看右上角斜線是否有皇后
            }
            --leftup;
            ++rightup;
        }
        return true;
    }
    private void printQueens(int []Queen){
        for (int row = 0; row < 8; row++) {
            for (int column = 0; column < 8; column++) {
                if (Queen[row]==column) System.out.print("   Q   ");
                else System.out.print("   *   ");
            }
            System.out.println();
        }
        System.out.print(count);
        System.out.println();
    }
}

每日一句:

種一棵樹的最好時間是十年前,其次是現(xiàn)在。 ?

到了這里,關(guān)于八皇后問題(回溯法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • python中級篇1:n皇后問題(回溯算法)

    hello!大家好,我是浪矢秀一。最近經(jīng)歷了許多事情,終于是恢復(fù)1次更新了。那么今天呢,我們來學(xué)習(xí)中級篇,需要學(xué)過不少python知識的人來學(xué)習(xí)。好了,廢話不多說,我們進入今天的課程! ? 在1個n*n的國際象棋棋盤上,放置n個皇后,要求:同1行、同1列、同1斜線上只能有1個皇后。 ? 既然

    2024年02月03日
    瀏覽(24)
  • 算法:回溯算法(以解決n皇后問題為例)

    算法:回溯算法(以解決n皇后問題為例)

    基本思想:回溯算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。八皇后問題就是回溯算法的典型,第一步按照順序放一個皇后,然后第二步符合要求放第2個皇后,如果沒有位置符合要求,那么就要改變第一個皇后的位置,重新放第2個皇后

    2024年02月05日
    瀏覽(17)
  • 算法與數(shù)據(jù)結(jié)構(gòu)——遞歸算法+回溯算法——八皇后問題

    算法與數(shù)據(jù)結(jié)構(gòu)——遞歸算法+回溯算法——八皇后問題

    八皇后問題是一個經(jīng)典的回溯算法問題,目的是在8×8的國際象棋棋盤上放置八個皇后,使得沒有皇后可以互相攻擊(即沒有兩個皇后在同一行、同一列或同一對角線上)。 回溯算法是一種解決問題的算法,它通過嘗試所有可能的解決方案來解決問題。在八皇后問題中,計算

    2024年02月09日
    瀏覽(21)
  • N皇后問題詳解:回溯算法的應(yīng)用與實踐(dfs)

    N皇后問題詳解:回溯算法的應(yīng)用與實踐(dfs)

    題目如上圖所示,在一個 n*n 的國際象棋棋盤上怎么擺放能使得皇后互相攻擊不到(也就是在 任意一列、一行、一條對角線上都不存在兩個皇后 ) 1.DFS 想要解決這個問題,我們可以使用dfs也就是 深度優(yōu)先遍歷 ,深度優(yōu)先搜索的步驟為先遞歸到底再回溯上來,顧名思義,df

    2024年03月26日
    瀏覽(26)
  • 八皇后問題,秒懂遞歸回溯(有圖詳解|c語言)

    八皇后問題,秒懂遞歸回溯(有圖詳解|c語言)

    目錄 ????前言 ????題目介紹 ????引入: ????解決思路: ????理論存在,實踐開始! ????難點1:如何表示對角線被占領(lǐng)? ????難點2:如何用遞歸的方法來放皇后? ????難點3:如何實現(xiàn)回溯? ????難點4:如何實現(xiàn)皇后位置的輸出? ????全部代碼如下: ??

    2024年02月02日
    瀏覽(24)
  • 【力扣 51】N 皇后(回溯+剪枝+深度優(yōu)先搜索)

    【力扣 51】N 皇后(回溯+剪枝+深度優(yōu)先搜索)

    按照國際象棋的規(guī)則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問題 研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。 給你一個整數(shù) n ,返回所有不同的 n 皇后問題 的解決方案。 每一種解法包含一個不同的 n 皇后

    2024年02月22日
    瀏覽(23)
  • 【算法】回溯:與遞歸,dfs的同質(zhì)與分別,剪枝與恢復(fù)現(xiàn)場的詳細理解,n皇后的回溯解法及算法復(fù)雜度分析。

    【算法】回溯:與遞歸,dfs的同質(zhì)與分別,剪枝與恢復(fù)現(xiàn)場的詳細理解,n皇后的回溯解法及算法復(fù)雜度分析。

    目錄 ?編輯 1.什么是回溯 2.關(guān)于剪枝 3.關(guān)于恢復(fù)現(xiàn)場 4.題目:二叉樹的所有路徑(凸顯恢復(fù)現(xiàn)場:切實感受回溯與深搜) 問題分析 ①函數(shù)設(shè)置為:void Dfs(root) ②函數(shù)設(shè)置為:void Dfs(root,path) 解題思想:使?深度優(yōu)先遍歷(DFS)求解。 代碼實現(xiàn) 5.N后問題 問題分析 4皇后的放置

    2024年04月16日
    瀏覽(20)
  • Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解數(shù)獨

    Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解數(shù)獨

    給定一個 沒有重復(fù) 數(shù)字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] ?排列問題與組合問題的不同之處就在于,沒有startIndex,同時需要設(shè)置一個used數(shù)組,遍歷過的就設(shè)置成true,下次遇到時跳過。 給定一個可包含重

    2024年01月20日
    瀏覽(22)
  • C#八皇后算法:回溯法 vs 列優(yōu)先法 vs 行優(yōu)先法 vs 對角線優(yōu)先法

    目錄 1.八皇后算法(Eight Queens Puzzle) 2.常見的八皇后算法解決方案 (1)列優(yōu)先法(Column-First Method): (2)行優(yōu)先法(Row-First Method): (3)對角線優(yōu)先法(Diagonal-First Method): (4)回溯法(Backtracking): ???????皇后問題是一個古老而著名的問題,它實質(zhì)上就是使棋

    2024年03月22日
    瀏覽(15)
  • DFS(深度優(yōu)先遍歷、N皇后問題、2N皇后問題)

    DFS(深度優(yōu)先遍歷、N皇后問題、2N皇后問題)

    目錄 一、回溯法與深度優(yōu)先搜索(DFS) 二、DFS與二叉樹的前序遍歷 2.1、二叉樹的前序遍歷 2.2、DFS 全排列 ?2.3、分析 三、N皇后問題 1. 回溯法: 是一種通過探索所有可能的候選解來找出所有解的算法。如果候選解被確認不是一個解的話(或者至少不是最后一個解),回溯法

    2024年03月21日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包