1. 程式人生 > >C++簡單實現八皇后問題

C++簡單實現八皇后問題

近來無聊,想著幾年前用c#實現的八皇后,是參考網上的答案,如今過了幾年,想試試有沒進步,用c++簡單地實現。

八皇后問題,是回溯演算法的經典例子,它的規則要求是同一行同一列同一條斜線不能有兩個皇后,不然會相互攻擊。這條件聽上去不難吧,可運算量卻是驚人的多啊。

首先,程式是演算法加資料結構,我這程式的資料結構是一個8*8的整型矩陣chessboard,全部初始化為0,這作為棋盤,每一格若為0則代表可以放棋子,另外還有一個長度為8的整型陣列path,記錄一次成功的排列,path[i]代表第i行棋子的位置。

然後,本程式有兩個關鍵函式,

void setTrap(int*chessboard,int row,int column,int boardLength,char value)

該函式的含義是在row行column列放置棋子,並在同一行同一列同一斜線的格子加上value。
bool retreat(int*chessboard,int* path,int row,int boardLength)

該函式的含義是回退,在row行回退,返回是否成功,步驟是首先把當前行走的那一步撤銷,然後再往前探測是否有可走的格子(value為0),若達到該行的盡頭還沒找到,返回false。

最後,就剩下啟動函數了

    for (int i=0; i<board_length; i++) {
        for (int j=0; j<board_length; j++) {
            if(chessboard[i*board_length+j]==0){
                chessboard[i*board_length+j]=i+board_length;
                setTrap(chessboard, i, j, board_length,i+board_length);
                path[i]=j;
                break;
            }
            else if (j==board_length-1) {
                for (int k=i; k>0; k--) {
                    if (retreat(chessboard, path, k-1, board_length)) {
                        j=-1;
                        i=k;
                        break;
                    }
                }
            }
        }
        if (i==board_length-1&&path[board_length-1]!=-1) {
            //succeed to get one solution
            for (int i=0; i<board_length; i++) {
                cout<<path[i]<<" ";
            }
            solutionCount++;
            cout<<endl;
            for (int k=i; k>=0; k--) {
                if (retreat(chessboard, path, k, board_length)) {
                    i=k;
                    break;
                }
            }
        }
    }
本演算法並未考慮棋盤旋轉的情況,所以有不少重複的佈局,故8*8的棋盤會有190中排列方式。

至此,本演算法大體結束了,完整程式碼地址:http://download.csdn.net/detail/xanxus46/7078239

一段時間以後重新做回以前不會的演算法,收穫還是不少的。

相關推薦

C++簡單實現皇后問題

近來無聊,想著幾年前用c#實現的八皇后,是參考網上的答案,如今過了幾年,想試試有沒進步,用c++簡單地實現。 八皇后問題,是回溯演算法的經典例子,它的規則要求是同一行同一列同一條斜線不能有兩個皇后,不

Java實現皇后問題,用陣列遞迴演算法,簡單易懂

八皇后問題 要將八個皇后放在棋盤上,任何兩個皇后都不能互相攻擊。即沒有兩個皇后是在同一行、同一列或者同一對角上。 典型的八皇后問題,使用Java寫的演算法,演算法雖比較簡單,但難免會有新手會犯疏漏和錯誤,希望大家可以批評指正,共同交流進步! 程式碼

[轉] A*尋路算法C++簡單實現

track pos endpoint 障礙 close math.h 不存在 rec 節點 參考文章: http://www.policyalmanac.org/games/aStarTutorial.htm 這是英文原文《A*入門》,最經典的講解,有demo演示 ht

[數據結構(二)]七種排序算法的C++簡單實現

末尾 技術分享 下標 ima http 直接 wap temp 部分 一.冒泡排序(Bubble Sort) 基本思想:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。 //冒泡排序 void BubbleSort(int *p, int lengt

60行c++簡單實現中綴表示式轉字尾

中綴表示式轉字尾表示式演算法 使用棧進行輔助 對於符號±/(),定義為/優先順序為2,’(’(左括號)優先順序為3,右括號’)'優先順序最低為0 對於一個表示式 如果當前字元為數字: 輸出到輸出佇列中; 否則當前字元是運算子號或

超級瑪麗遊戲 C 簡單實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言解決皇后問題程式碼及解析

八皇后問題是一個古老而著名的問題。該問題是19世紀著名的數學家高斯1850年提出:在一個8*8國際象棋盤上,有8個皇后,每個皇后佔一格;要求皇后之間不會出現相互“攻擊”的現象,即不能有兩個皇后處在同一行、同一列或同一對角線上。問共有多少種不同的方法? 回溯演算法也叫試探法,它是一種搜尋問題的解的方法。冋溯演

Scheme來實現皇后問題(1)

  版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須註明原文網址   http://www.cnblogs.com/Colin-Cai/p/9768105.html   作者:窗戶   QQ/微信:6679072   E-mail:[email

Scheme來實現皇后問題(2)

  版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須註明原文網址   http://www.cnblogs.com/Colin-Cai/p/9790466.html   作者:窗戶   QQ/微信:6679072   E-mail:[email

超級瑪麗遊戲 C 簡單實現

                超級瑪麗遊戲 C++簡單實現 今天的過了兩天後的 ,媽媽破門而入,就是讓小麻雀每天跳十次懸崖,小麻雀能飛了,正看到林肯選舉議員的部分,不敢多說,讓你無法忘懷,大約可以飛4米了,合唱獲得成功的時候,請轉告這個沉默的朋友。記得有一次,接著憤怒的吼了一聲,就要離開這個默默看著我們成長

C#簡單實現建立windows服務

本機環境:win10   64位   vs2017 1.新建WindowsService1 2.在設計頁面單機右鍵->新增安裝程式: 3.右鍵serviceProcessInstaller1,單擊屬性,將Accou

C++簡單實現幾種常用的設計模式

本文介紹幾種常用的設計模式並給出C++實現。 1.單例模式 作用:保證一個類只有一個例項,並提供一個訪問它的全域性訪問點,使得系統中只有唯一的一個物件例項。 應用:常用於管理資源,如日誌、執行緒池 實現要點: 在類中,要構造一個例項,就必須呼叫類的建構函式,並且為了保證

C++ 簡單實現HTTP GET/POST 請求

轉載出處:詳情http://m.blog.csdn.net/article/details?id=16336713 HTTP(超文字傳輸協議)是一種客戶端與服務端的傳輸協議,最早用於瀏覽器和伺服器之間的通訊,後來因為其使用靈活、方便等特點,廣泛用於客戶端與服務端的通訊。文章

C++ 簡單實現壓棧出棧

/********************************************************************** * Copyright (c)2015,WK S

C++簡單實現string類

面試經常會考到的型別,主要考的是幾個建構函式和過載運算子,簡單的實現一下 class CString { public: CString(); ~CString(); int Length()const{return m_len;} CString(const ch

A*尋路演算法的C++簡單實現

2007/8/13 17:26:59 #include <iostream> #include <ctime> #include <list> #include <algorithm> #include <cassert&

Linu c++ 簡單實現連結串列類模板

    之前在C語言裡面有實現連結串列,現在用c++簡單的實現連結串列類,只實現了插入節點和排序,我先開個好頭,其餘的程式碼基本上和C語言裡面的程式碼差不多,直接上程式碼咯;#include <iostream>#include <cstdio>usi

谷歌百度以圖搜圖 "感知雜湊演算法" C#簡單實現

/// <summary> /// 感知雜湊演算法 /// </summary> public class ImageComparer { /// <summary> /// 獲取圖片的Hashcode /// &

廣義表的C++簡單實現

廣義表是資料結構中非常關鍵的一部分,它的學習對於樹和二叉樹有很大的起承作用。那麼,它是怎麼實現的呢?廣義表的實現應用到了一個很熟悉的演算法——遞迴。來看看它的程式碼吧!#pragma once #include<iostream> #include<cass

Python實現皇后問題

  八皇后問題是指8*8位的棋盤上,擺8個皇后,使得任意一個皇后不在其他皇后的同一橫線上,同一豎線上,同一斜線(包括右上到左下斜線和左上到右下斜線)上。這個問題是一個經典的遞迴問題。 #八皇后問題