1. 程式人生 > >C++ 八皇后 遞迴演算法實現

C++ 八皇后 遞迴演算法實現

八皇后問題感覺是遞迴演算法中比較簡單的一種,核心思想就是放置之前檢查行列四個斜方位即可,共92種方案,還是挺有趣的,和漢諾塔一樣,應該屬於遞迴比較經典的問題

#include<iostream>
using namespace std;
int g_count=0;

bool CanPlace(int row,int col,int (*chess)[8]){
	
	for(int i=0;i<8;i++){
		if(chess[i][col]==1){//check col
			return false;
		}
		if(chess[row][i]==1){//check row
			return false;
		}
	}


	for(int i=0;i<8;i++){//check left-front
		if(row-i<0||col-i<0){
			break;
		}
		if(chess[row-i][col-i]==1){
			return false;
		}
	}
	

	for(int i=0;i<8;i++){//check right-front
		if(row-i<0||col+i>7){
			break;
		}
		if(chess[row-i][col+i]==1){
			return false;
		}

	}	
		

	for(int i=0;i<8;i++){//check left-below
		if(row+i>7||col-i<0){
			break;
		}
		if(chess[row+i][col-i]==1){
			return false;
		}
	}	
	

	for(int i=0;i<8;i++){//check right-below
		if(row+i>7||col+i>7){
			break;
		}
		if(chess[row+i][col+i]==1){
			return false;
		}
	}
	
	return true;
}
void EightQueen(int row,int col,int (*chess)[8]){
	
	//temp 2Darray
	int chess2[8][8];
	
	//put last scene to temp 2Darray
	for(int i=0;i<8;i++){
		for(int j=0;j<8;j++){
			chess2[i][j]=chess[i][j];
		}
	}

	if(row==8){//show result
		for(int i=0;i<8;i++){
			for(int j=0;j<8;j++){
				cout<<chess2[i][j]<<' ';
			}
			cout<<endl; 
		}
		cout<<endl;
		g_count++;
	}
	else{
		for(int j=0;j<8;j++){
			if(CanPlace(row,j,chess2)){
				
				chess2[row][j]=1;//put chess
				
				EightQueen(row+1,j,chess2);//move to next row
				
				chess2[row][j]=0;//remove chess to use for next by same chess 2Darray
				
			}
		} 
	}
};

int main(){
	int chess[8][8]={
		0
	};
	
	EightQueen(0,0,chess);
	
	cout<<g_count<<endl;
	
	return 0;
}


相關推薦

C++ 皇后 演算法實現

八皇后問題感覺是遞迴演算法中比較簡單的一種,核心思想就是放置之前檢查行列四個斜方位即可,共92種方案,還是挺有趣的,和漢諾塔一樣,應該屬於遞迴比較經典的問題 #include<iostream> using namespace std; int g_count=

[計算機程式設計C++] Fibonaci數列的與非演算法實現

本文是對西安交通大學C++慕課第三章程式設計練習的16題的講解。 參考部落格:https://blog.csdn.net/zombie_slicer/article/details/38871799 題目內容: 編寫程式,顯示Fibonaci序列的前n項(從

二叉樹中序遍歷(非)演算法實現--C語言

今天繼續二叉樹的學習。 昨天寫了一遍二叉樹的先序遍歷(非遞迴)演算法,今天寫一下二叉樹的二叉樹的中序遍歷(非遞迴)演算法。中序遍歷的非遞迴演算法有兩種,但是個人覺得只要掌握一種就可以了,只要自己的邏輯清晰,會哪一種又有什麼關係呢~ 首先給出今天的二叉樹的示例圖: 程式碼如下:

二叉樹後序遍歷(非)演算法實現--C語言

  一直說要寫二叉樹的後序非遞迴遍歷演算法,但是前兩天各種事情,今天終於有時間好好寫一寫二叉樹的後序遍歷演算法。   二叉樹的後序遍歷演算法比先序和中序的遍歷演算法要複雜一些。其出棧條件有兩種情況: 棧頂元素所指向的節點的左子樹和右子樹均為空; 棧頂元素所指向的節點的左子樹

【資料結構週週練】012 利用佇列和非演算法實現二叉樹的層次遍歷

一、前言 二叉樹的遍歷是比較多樣化的遍歷,有很多種遍歷方式,先序遍歷,中序遍歷,後序遍歷,層次遍歷等等。本次給大家講的是層次遍歷,為了方便,我將題目中的資料改為編號,從左往右,從上往下依次遍歷。方便大家看到結果。 二、題目 將下圖用二叉樹存入,並通過層次遍歷方式,自上而下,從左往右對

C語言】演算法的學習

一、初識遞迴 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少

一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 用演算法實現。//斐波那契數列

1 public class MainClass 2 { 3 public static void Main() 4 { 5 Console.WriteLine(Foo(30)); 6 } 7 public static int Foo(int i) 8 {

資料結構——皇后解法

程式碼來源:https://www.cnblogs.com/houkai/p/3480940.html 參考程式碼:(註解多為自己填寫) #include <iostream> #include <stdlib.h> using namespace std;

Java利用演算法實現24點遊戲

24點遊戲 經典的紙牌益智遊戲,常見遊戲規則:         從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求程式設計解決24點遊戲。         基本要求: 隨機生成4個代表撲克牌牌面

二叉樹遍歷的非演算法實現

linux c++ 模板類 討論範圍 本部落格只實現二叉樹非遞迴演算法的遍歷,請自行學習二叉樹和模板類等相關知識。程式碼中附帶大量註釋,所以就不在進行詳細說明。 中序遍歷 template <typename T>void Post<T>

【資料結構週週練】010 演算法實現二叉樹的建立與遍歷

一、前言 上兩篇週週練部落格講了二叉樹的建立與遍歷,建立時,通過建立棧來存放結點,方便二叉樹的建立,這種建立二叉樹的方式採用了非遞迴演算法,本次內容採用遞迴的方式來建立二叉樹,大家可以通過對比程式碼量,感受一下遞迴的魅力。同時遍歷過程也是通過遞迴演算法。 如果大家第一次看

N皇后 演算法

int n; int queenpos[100];     //用來存放算好的皇后位置。最左上角是(0.0)  void nqueen (int k);   int main() {     cin >> n;          nqueen(0);     

演算法實現逆序字串

題目:編寫一個函式reverse_string(char * string)(遞迴實現) 實現:將引數字串中的字元反向排列。 要求:不能使用C函式庫中的字串操作函式。 解題思路: 逆序

演算法實現斐波那契數列

假定兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那麼一年以後可以繁殖多少對兔子? 這就是著名的斐波那契數列,也稱作兔子數列。 一、問題分析 剛開始,有1對幼兔,兔子總對數為1; 經過一個月後,幼兔長為小兔,兔子總對數為1

演算法實現n的階乘

遞迴是一種計算演算法,程式呼叫自身的程式設計技巧成為遞迴,一般來說遞迴需要有邊界條件,當不滿足邊界條件時一直執行遞迴,直到滿足邊界條件,遞迴返回 package DiGui; /**  * 鍵盤錄入一個整數n 求n的階乘  */ import java.util.Scann

皇后 只能得到路線個數 但是沒有輸出圖

#include <iostream> #include <stdio.h> using namespace std; static int gEightQueen[8] = {0}; static int gCount = 0; void print() { int

經典演算法之非演算法實現二叉樹前、中、後序遍歷

/************************ author's email:[email protected] date:2017.12.24 非遞迴演算法實現二叉樹前、中、後序遍歷 ************************/ #include<

c++使用樸素演算法(自頂向下)和動態規劃dp(帶備忘的自頂向下,自底向上)解決鋼條切割及執行例項結果

本博文資料來源於演算法導論第三版 動態規劃有兩種等價實現方法:帶備忘的自頂向下發(topDownWithMemoization),自底向上方法,付出額外的記憶體空間來節省計算時間,是典型的時空權衡,遞迴時會儲存每個子問題的解 長度n與對應價格p關係 1~10的對應最

全排列演算法之Perm演算法實現

題目描述: 給定一個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字串中的字母已經按照從小到大的順序排列。 輸入: 輸入只有一行,是一個由不同的小寫字母組成的字串,已知字串的長度在1

oracle 學習之--------利用演算法實現階乘

-------------------------- --遞迴演算法實現階乘      -- --create by aven!       -- -------------------------- CREATE OR REPLACE PROCEDURE TEST01(