1. 程式人生 > >回溯法解決八皇后問題(迴圈/遞迴)

回溯法解決八皇后問題(迴圈/遞迴)

# 回溯法解決八皇后問題


def place(l, k):
    for i in range(1,k):
        if l[i] == l[k] or abs(k-i) == abs(l[k]-l[i]):
            return False
    return True


# 迴圈
def queue(n):
    l = [0]*(n+1)
    k = 1
    while k >= 1:
        l[k] += 1
        while l[k] <= n and not place(l, k):
            l[k] += 1
        if l[k] <= n and k == n:
            print '-'*10
            for i in l:
                print i, " ",
            print
        # 進入下一個放置點
        elif l[k] <= n and k < n:
            k += 1
        # 回溯
        else:
            l[k] = 0
            k -= 1


# 遞迴
def queue2(n,k,l):
    if k == n+1:
        print '-' * 20
        for i in l:
            print i, " ",
        print
    else:
        for i in range(1,n+1):
            l[k] = i
            if place(l,k)and k<=8:
                queue2(n,k+1,l)

相關推薦

回溯解決皇后c++

八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當

回溯解決皇后問題迴圈/

# 回溯法解決八皇后問題 def place(l, k): for i in range(1,k): if l[i] == l[k] or abs(k-i) == abs(

回溯解決皇后問題

一、八皇后問題 皇后是國際象棋中威力最大的棋子。她可以攻擊同一行、同一列以及與她處在斜線上的棋子。八皇后問題在1848年由國際西洋棋棋手馬克斯·貝瑟爾提出:如何在8x8格的棋盤上擺放八個皇后,使她們不能互相攻擊? 上圖是92種擺法中的其中一種。 一個有用的經驗是:在正式

第一次上傳程式碼 處女秀-回溯解決皇后問題

c語言 # include<stdio.h> # include<math.h> # define max 8 int queen[max],sum=0; int check(int n){ int i; for(i=0;i<n;i+

回溯解決皇后問題的思路,並求出17皇后解的數量(c#,c++,python表示)

1.解決思路借用網上一張圖,中間那個紅點表示的就是皇后,這圖的意思也就是一個皇后的影響範圍為這這個皇后所在的那一列,那一行,對角線以及次對角線。其它的皇后不能在它的影響範圍裡否則會衝突。八皇后也就是在一個8x8的棋盤上後置8個皇后,皇后的數量與棋盤的行列數一樣。這是基礎,再來

使用回溯解決皇后問題(同樣適用於N皇后)。

在學習資料結構的時候,看到了一道八皇后的問題。寫完後,再去網上檢視發現原來這個問題有這麼多的優化解法,相比之下相形見絀。但我還是記錄下來,有興趣的小夥伴可以看看。 先大致說下我的思路 建立一個初始化值為0的8x8的陣列,0代表無皇后且不在其他

回溯解決2n皇后8皇后問題

8皇后問題是演算法入門的經典,在8*8的國際象棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后都不能處於同一 今天要說的2n皇后問題與傳統的8皇后問題有些不同,在一個n*n的棋盤中,有些位置不允許放皇后,現在要向棋盤中 放入n個黑皇后和n個白皇后,使任意的兩個黑白皇后

回溯解決皇后問題(Java實現)

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

回溯解決N皇后問題以四皇后為例

回溯法解決N皇后問題(以四皇后為例) 其他的N皇后問題以此類推。所謂4皇后問題就是求解如何在4×4的棋盤上無衝突的擺放4個皇后棋子。在國際象棋中,皇后的移動方式為橫豎交叉的,因此在任意一個皇后所在位置的水平、豎直、以及45度斜線上都不能出現皇后的棋子,例子 要求程式設計求出符合要求的情

小朋友學經典演算法14回溯皇后問題

一、回溯法 回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。 二、八皇后問題 (一)問

【演算法分析】回溯皇后問題n皇后問題

回溯法解題思路: (1)針對所給問題,定義問題的解空間;    (2)確定易於搜尋的解空間結構;    (3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。 八皇后問題:

回溯解決N皇后問題java實現

1.簡單介紹回溯法思路,就是將所有的結果變成一棵樹,從樹的結點開始訪問,採用深度優先策略,從樹的根結點開始訪問,如果滿足條件,繼續訪問下一層,如果不滿足條件,返回上一個結點,繼續訪問其它結點。重複操作。 2. 對於N皇后問題,我特意做了一張圖片。首先放置第一

皇后問題:解決/C語言基礎方法

/************************* *八皇后問題:遞迴解決/C語言 *按照8層8叉樹來想象,共有8^8種可能,對應每個葉子節點; *由根到葉子,自左至右遍歷每種情況; *剪枝掉不可行的方案; *及時輸出可行方案,繼續遍歷; *其間並未對每種可行方案累計儲存

C++解決皇后問題的超詳細解答

博主初學C++資料結構與演算法(清華大學出版社)第四版,由於程式清單5-2沒有詳細解答且程式碼不完整,思考了一個早上才恍然大悟,深感自己閱讀程式碼以及寫程式碼能力的不足,並在此記錄,同時也希望也能幫到有需要的人!  1、什麼是八皇后問題? 在8×8格的國際象棋上擺放八個皇

回溯皇后問題

本演算法將第第x行皇后的列編號記為C[x],回溯求符合條件的tot,遞迴邊界為從0到7(八皇后),皇后為逐行放置,cur-C[cur] == j-C[j] || cur+C[cur] == j+C[j]判斷皇后是否在同一對角線上話不多說,直接上程式碼: #include<s

回溯解決N皇后問題

八皇后問題 在棋盤上放置8個皇后,使得它們互不攻擊,此時每個皇后的攻擊範圍為同行同列和同對角線,要求找出所有解。 遞迴函式將不再遞迴呼叫它自身,而是返回上一層呼叫,這種現象稱為回溯(backtracking)。 當把問題分成若干步驟並遞迴求解時,如果當前步驟沒有合法選擇,則函式將返回

【資料結構與演算法】回溯解決N皇后問題,java程式碼實現

N皇后問題 問題描述 在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法,這稱為八皇后問題。 延伸一下,便為N皇后問題。 核心思想 解決N皇后問題有兩個關鍵點。一是如何進行放置棋子,二是如何驗證棋子是否符合

【基礎演算法】回溯皇后問題

#include"iostream" #include"stdlib.h" using namespace std; int x[8],tot=0; bool B(int x[],int k) { int i; for(i=0;i<k;i++) if(x[i]==x[

第五第六課------推+記憶話搜尋+搜尋皇后思想是做夢+各種剪枝思想

搜尋是一個漫長的過程貫徹整個oi; 八皇后------- #include <bits/stdc++.h> #define inf 0x7f using namespace std; int n,ans,a[inf],b[inf],c[inf],d[inf]; void print

回溯皇后問題

關於八皇后的介紹我就不再這裡多囉嗦了,大家可以自行百度。 現在,我來說明一下八皇后的限制條件: 1.在同一行內,皇后不能出現兩次; 2.在同一列內,皇后不能出現兩次; 3.在同一條對角線內,皇后不能出現出現兩次。 問題是:找出一個位置使得八皇后同時存放在棋盤上且互相