1. 程式人生 > >遞迴,八皇后問題

遞迴,八皇后問題

#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;

int cnt = 0;
int n = 8;
int P[10] = {0};
bool hashTable[10] = {false};

void print()
{
    for(int i = 1; i <= n; i++)
        printf("%d",P[i]);
    printf("\n");
}

// 從第1~第n行,針對每一行放置的位置(即第幾列)
// ,進行全排列,篩選符合條件的組合
void generateP(int index) { if(index == n+1) { cnt++; print(); return ; } for(int x = 1; x <= n; x++) { if(hashTable[x] == false) { bool flag = true; for(int pre = 1; pre < index; pre++) { if
(abs(index-pre) == abs(x-P[pre])) { flag = false; break; } } if(flag) { P[index] = x; hashTable[x] = true; generateP(index + 1); hashTable[x] = false
; } } } } int main() { generateP(1); printf("%d",cnt); return 0; }

相關推薦

皇后問題

#include <cstdio> #include <iostream> #include <cstdlib> using namespace std; int cnt = 0; int n = 8; int P[10]

求解皇后問題

問題描述會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將 8 個皇后放在棋盤上(有 8 * 8 個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。 對於某個滿足要求的 8 皇后的擺放方法,定義一個皇后串 a 與之對應, a=b1b2..

C語言回溯法求解皇后問題

Problem E 8皇后問題 時限:1000ms 記憶體限制:10000K 總時限:3000ms 描述: 輸出8皇后問題所有結果。 輸入: 沒有輸入。 輸出: 每個結果第一行是No n:的形式,n表示輸出的是第幾個結果;下面8行,每行8個字元,‘A’表示皇后,‘.’

java利用解決皇后問題

問題簡介: 要求在一個8*8的棋盤上放置8個皇后,使任意兩個皇后都不同行不同列且不在同一條斜對角線上。採用遞迴和回溯的思想解決這一問題是較為直觀的。一開始,棋盤上的任意格子都可落子,因此可任意選擇第一個皇后的位置。放置了第一個皇后之後,棋盤上的可落子格子的分佈將發生改變,然

python基於右解決皇后問題的方法

凡是線性回溯都可以歸結為右遞迴的形式,也即是二叉樹,因此對於只要求一個解的問題,採用右遞迴實現的程式要比回溯法要優美的多。def Test(queen,n): '''這個就不用說了吧,就是檢驗第n(下標,0-7)行皇后的位置是否合理''' q=queen for i in xrange(n): i

皇后問題(回溯)

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

8皇后以及N皇后演算法探究回溯演算法的JAVA實現迴圈控制及其優化

研究了遞迴方法實現回溯,解決N皇后問題,下面我們來探討一下非遞迴方案 實驗結果令人還是有些失望,原來非遞迴方案的效能並不比遞迴方案效能高 程式碼如下: package com.newflypig.eightqueen; import java.util.Date; /**

8皇后以及N皇后演算法探究回溯演算法的JAVA實現資料結構“棧”實現

是使用遞迴方法實現回溯演算法的,在第一次使用二維矩陣的情況下,又做了一次改一維的優化 但是演算法效率仍然差強人意,因為使用遞迴函式的緣故 下面提供另一種回溯演算法的實現,使用資料結構”棧“來模擬,遞迴函式的手工實現,因為我們知道計算機在處理遞迴時的本質就是棧 時間複雜度是一樣的,空間

【qduoj - 夏季學期創新題】矩形剖分(dp)

題幹: 描述   對一個給定的矩形,將其劃分成儘可能少的正方形,輸出正方形的最少個數。例如,如下圖所示的情況,則輸入為3和4,輸出為4。 輸入   輸入兩個整數中間用空格分開。 輸出   輸出最少分割成的正方形的個數。 輸入樣

迭代和遍歷

  遞迴   如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。   條件:必須要有收斂條件和遞迴公式。   特性:1.必須有一個明確的結束條件。      2.每次進入更深一層遞迴時,問題規模相比賞析遞迴都應有所減少。      3.遞迴效率不高,遞迴層次過多會導致棧溢位(遞迴最大999層)。

二叉樹的建立、遍歷

#include<bits/stdc++.h> using namespace std; typedef struct ListNode{ struct ListNode *Lchild, *Rchild; string str; ListNode():Lchild

PHP 回撥函式

遞迴: //回撥函式 把一個函式的名字以字串形式傳到另一個函式中,按變數函式的使用方法使用這個函式 function jia($num1,$num2){ return $num1 + $num2; } function ha($a){

java斐波那契數列(Fibonacci sequence)的三種方式:備忘錄動態規劃

java斐波那契數列(Fibonacci sequence)的三種方式:遞迴,備忘錄,動態規劃 1.最常使用的是遞迴,就是從上往下尋找答案,然後在返回來。 2.備忘錄也是從上往下,只是去掉了遞迴中重複計算的部分,因為它使用一個容器來裝已經計算出的值,這裡就多一個判斷,如果計算過該式子,就直接

圖的深度優先遍歷(非+詳解)

圖的深度優先遍歷 非遞迴演算法: #include<iostream> #include<stack> using namespace std; const int MaxSize=100; class MGraph{//鄰接矩陣的構建 p

【CodeForces - 266C】Below the Diagonal (子問題貪心模擬)

題幹: You are given a square matrix consisting of n rows and n columns. We assume that the rows are numbered from 1 to

:N皇后問題

1.問題 在國際象棋中,皇后的移動方式為橫豎交叉的,因此在任意一個皇后所在位置的水平、豎直、以及45度斜線上都不能出現皇后的棋子,例子 2.思路 每個皇后必須放在不同行、不同列上、不同斜線上 3.程式碼 #include <iostream> #include

C# 不用獲取無限層級資料

物件屬性 public class ResList { public int ID { get; set; } public List<ResList> Child { get; set; } = null; public int

LeetCode刷題Easy篇斐波那契數列問題(,尾和動態規劃解法)

題目 斐波那契數列:  f(n)=f(n-1)+f(n-2)(n>2) f(0)=1;f(1)=1;  即有名的兔子繁衍問題  1 1 2 3 5 8 13 21 .... 我的解法 遞迴 public static int Recursion

(D11)Python-函數語言程式設計閉包

函數語言程式設計 函數語言程式設計 函數語言程式設計是指用一系列函式解決問題 函式是一等公民 好處: - 用每個函式完成細小的功能,一系列函式組合可以解決大問題 - 函式僅接收輸入併產生輸出,不包含任何能影像輸出的內部狀態 函式的可重入性:

java使用複製資料夾下的所有子檔案

1.先判斷要複製的檔案是資料夾還是檔案,如果是檔案,就進行復制,如果是資料夾,就進行下一層的迴圈,運用遞迴的特性,將所有的檔案進行復制。 2.存在問題,相對來說,使用字元流來進行復制有缺陷,在複製的過程中,對於複製的圖片啊,ppt什麼的檔案會有損害,可能不能開