N皇后問題(遞迴與非遞迴解法)
最近演算法老師講到了N皇后問題,我順便在這邊總結一下他的思路,主要還是深搜加剪枝.
解題思路:用陣列c儲存每個皇后在下標行中的位置(即列),然後進行深搜加剪枝判斷,如果不符合條件了,則回朔.思路很簡單,下面的程式碼包含兩種解法.
#include <stdio.h> #include <stdbool.h> #define M 8 //修改此處改變皇后的基數 bool check(int *c,int addr); void q(int k); void display(int *c,int n); void qt(int k); int c[20]={0}; int main(void) { qt(1); //非遞迴 printf("\n"); qt(1); //遞迴 return 0; } bool check(int *c,int k) { int i=0; for(i = k-1;i>=1;i--) { if(c[i]==c[k]||(c[i]-c[k]==i-k)||(c[i]+i==c[k]+k)) return false; } return true; } void display(int *c,int n) { int i=0,j=0; for(i=1;i<=n;i++) printf("%d ",c[i]); printf("\n"); } //遞迴解法 void q(int k) //k代表深度 { int i=0; for(i=1;i<=M;i++) { c[k] = i; if(check(c,k)) //判斷當前皇后放置位置是否合理 { if(k==M) //到達最後一層,輸出 { display(c,k); } else { q(k+1); //向下搜尋 } } c[k] = 0; } } //非遞迴解法 void qt(int k) //k代表深度 { while(k>=1) //k=1為第一層 { while(c[k]<M) //搜尋一層 { c[k]++; if(check(c,k)) //判斷當前皇后放置位置是否合理 { if(k==M) //到達最後一層,輸出 { display(c,k); } else { k++; //向下搜尋 } } } c[k] = 0; //向上回朔,c[k]要初始化,防止資料汙染 k--; //向上 } }
相關推薦
N皇后問題(遞迴與非遞迴解法)
最近演算法老師講到了N皇后問題,我順便在這邊總結一下他的思路,主要還是深搜加剪枝.解題思路:用陣列c儲存每個皇后在下標行中的位置(即列),然後進行深搜加剪枝判斷,如果不符合條件了,則回朔.思路很簡單,下
n的階乘(遞迴與非遞迴)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll f(ll n)///遞迴演算法 { if(n==0 || n==1) return 1; else return n * f
樹的前、中、後序遍歷演算法(遞迴與非遞迴)、層序遍歷
二叉樹層次遍歷 非遞迴 void LevelOrder(Tree* T) { if(T == nullptr) return ; queue<Tree *> myqueue; myqueue.push(T); while(!myqueu
斐波那契(遞迴與非遞迴)
遞迴 long jumpFloor(int number) { if(number <= 0) return 0; else if(number == 1 ) return 1; return jumpFloor(number-1)
斐波那契數列(遞迴與非遞迴)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e2+10; ll a[MAXN]; ll F[MAXN]; ll f(ll n) ///遞迴 { if
後續遍歷--遞迴與非遞迴(java版)
先訪問左右孩子,再訪問根節點。同樣還是採用棧的形式,但是問題是,先訪問左孩子出棧,根節點不能刪除,再訪問右孩子出棧,最後訪問根節點出棧。我們的思路是這樣的: 對於某個節點p: 1)將p壓入棧中,並將p所有的左孩子,全部壓入棧中: while(stk.
二叉樹深度(Depth)`遞迴`與`非遞迴`
二叉樹 (`Depth`)遞迴 深度優先遍歷 DFS 二叉樹的高度(深度)為二叉樹結點層次的最大值,也可以認為在根節點不為 nullptr 的情況下左右子樹的最大高度 + 1; 先序(後序)遍歷求解二叉樹高度(Depth)的遞迴演算法 演算法描述:深度優先遍歷
楊輝三角的C語言實現(遞迴與非遞迴)
本文用C語言程式碼實現楊輝三角 遞迴演算法依據於f(m,n)=f(m-1,n)+f(m-1,n-1) 其中(m,n)為楊輝三角第m行第n個元素 演算法程式碼如下: #include <stdio.h> //遞迴函式 int func(int m,in
1.遞迴和非遞迴分別實現求第n個斐波那契數。 遞迴與非遞迴的典型題型
1.遞迴和非遞迴分別實現求第n個斐波那契數。 2.編寫一個函式實現n^k,使用遞迴實現 寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回組成它的數字之和,例如,呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19 編寫一個
二叉樹後序遍歷(遞迴與非遞迴)演算法及C語言實現
二叉樹後序遍歷的實現思想是:從根節點出發,依次遍歷各節點的左右子樹,直到當前節點左右子樹遍歷完成後,才訪問該節點元素。 圖 1 二叉樹 如圖 1 中,對此二叉樹進行後序遍歷的操作過程為: 從根節點 1 開始,遍歷該節點的左子樹(以節點 2 為根節點); 遍歷節點 2 的左子樹(以節點 4 為根
二叉樹先序遍歷(遞迴與非遞迴)及C語言實現
二叉樹先序遍歷的實現思想是: 訪問根節點; 訪問當前節點的左子樹; 若當前節點無左子樹,則訪問當前節點的右子樹; 圖 1 二叉樹 以圖 1 為例,採用先序遍歷的思想遍歷該二叉樹的過程為: 訪問該二叉樹的根節點,找到 1; 訪問節點 1 的左子樹,找到節點 2; 訪問節點 2 的左子
二叉樹遞迴與非遞迴的(前,中,後)遍歷
#include<stdio.h> #include<stdlib.h> typedef struct node { char data; struct node *lchild,*rchild; }bintnode; typedef struct
二叉樹的前序,中序,後序,層次遍歷(遞迴與非遞迴方式)
以前在學校學過二叉樹的遍歷,工作後基本上沒用到,現在整理下這幾種排序演算法: 1.java的測試方法: package leetcode.TestList; /** * @author zhangyu * @version V1.0 * @ClassName: TreeNode *
Java排序演算法(三)--歸併排序(MergeSort)遞迴與非遞迴的實現
歸併有遞迴和非遞迴兩種。 歸併的思想是: 1.將原陣列首先進行兩個元素為一組的排序,然後合併為四個一組,八個一組,直至合併整個陣列; 2.合併兩個子陣列的時候,需要藉助一個臨時陣列,用來存放當前的
二分查詢演算法(遞迴與非遞迴兩種方式)
首先說說二分查詢法。 二分查詢法是對一組有序的數字中進行查詢,傳遞相應的資料,進行比較查詢到與原資料相同的資料,查詢到了返回對應的陣列下標,沒有找到返回-1; 如下示例,其中有序陣列中, 是按照從小到
資料結構——二叉樹的遞迴與非遞迴遍歷(先序,中序,後序)
實驗專案五 二叉樹基本操作的實現 課程名稱:資料結構 實驗專案名稱:二叉樹基本操作的實現 實驗目的: 1.掌握樹的基本操作—遍歷。 實驗要求: 1、 分別用遞迴和非遞迴的方法實現一棵樹的三種遍歷。 實驗過程: 建立一棵二叉樹(二叉樹如下圖所示);
深度優先搜尋(DFS)遞迴與非遞迴實現邏輯詳解
遞迴與非遞迴: 資料結構對於學習程式設計的人來說是非常重要的,我們在現實生活碰到的各種煩難問題可以用遞迴來實現,一個遞迴思想就把問題給簡單化了,但是我們都知道遞迴是非常耗時的,一旦資料量龐大起來,遞迴
樹的遍歷(遞迴與非遞迴版本)
樹的遍歷 題目要求 要求4個函式分別按照訪問順序打印出結點的內容,格式為一個空格跟著一個字元。 #include <stdio.h> #include <stdlib.h> typedef char ElementType
二叉樹前序、中序、後序遞迴與非遞迴遍歷+層序遍歷(java)
前序遞迴遍歷演算法:訪問根結點-->遞迴遍歷根結點的左子樹-->遞迴遍歷根結點的右子樹 中序遞迴遍歷演算法:遞迴遍歷根結點的左子樹-->訪問根結點-->遞迴遍歷根結點的右子樹 後序遞迴遍歷演算法:遞迴遍歷根結
圖的深度優先和廣度優先演算法(DFS遞迴與非遞迴)
本部落格前面文章已對圖有過簡單的介紹,本文主要是重點介紹有關圖的一些具體操作與應用 無向圖——鄰接矩陣的深度優先和廣度優先演算法實現 測試環境:VS2008(C) #include "st