欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 自定義棧實(shí)現(xiàn)迷宮求解

 更新時(shí)間:2017年07月05日 10:22:17   投稿:lqh  
這篇文章主要介紹了C++ 自定義棧實(shí)現(xiàn)迷宮求解的相關(guān)資料,需要的朋友可以參考下

C++ 自定義棧實(shí)現(xiàn)迷宮求解

一:迷宮求解

是一個(gè)鍛煉我們的算法求解能力的問題,它的實(shí)現(xiàn)方法有很多;今天我們就介紹其中的用棧求解的方法。

二:什么是棧:

      大家應(yīng)該都有往袋子里裝東西的經(jīng)歷,在往袋子里裝滿東西之后,當(dāng)我們?nèi)ト〉臅r(shí)候,總是先從最后放進(jìn)去的東西的地方去取。也就是后進(jìn)先出(FILO)。雖然棧的單向性用起來會沒有鏈表那樣可以在任意位置對數(shù)據(jù)進(jìn)行操作,但是正因?yàn)槿绱藯R矌砹撕艽蟮姆奖恪?br />

三:迷宮求解

現(xiàn)在我們要在下面的迷宮尋找一條可行的路徑

 1 1 1 1 1 1 1 1 1 1
 1 0 0 1 1 0 0 0 0 1
 1 0 0 0 1 0 1 0 0 1
 1 0 1 0 0 0 1 1 0 1
 1 0 1 0 0 0 1 1 1 1
 1 0 1 1 1 0 1 1 1 1
 1 0 1 1 1 0 1 1 1 1
 1 1 1 1 1 0 0 0 1 1
 1 1 1 1 1 1 1 0 0 1
 1 1 1 1 1 1 1 1 1 1

首先我們需要在程序中表示上面的迷宮,該問題可以用數(shù)組實(shí)現(xiàn)

1:棧的定義

/************************************************************************/ 
/*自定義棧                                     */ 
/*通過自定義的簡單棧以滿足迷宮求解        */ 
/*功能:push() 將元素加入棧中                 */ 
/*        pop() 退棧;topValue() 獲得棧頂元素    */ 
/*        clear() 清除棧 length() 獲得棧中元素個(gè)數(shù)*/ 
/************************************************************************/ 
#include <stack> 
#include <iostream> 
using namespace std; 
 
template<typename Elem> class PathStack: public stack<Elem> 
{ 
private: 
  int size; 
  int top; 
  Elem* listArray; 
public: 
  PathStack(int sz = DefaultListSize){ 
    size = sz; 
    top = 0; 
    listArray = new Elem[sz]; 
  } 
  ~PathStack(){ delete []listArray; } 
  void clear(){ top = 0; } 
  /****向棧中加入元素****/ 
  bool push(const Elem& item); 
  /***********退棧**********/ 
  Elem pop(); 
  /********獲得棧頂元素*******/ 
  Elem topValue() const; 
  int length() const { return top; } 
}; 
 
template<typename Elem> 
bool PathStack<typename Elem>::push(const Elem& item){ 
  if(top == size) return false; 
  listArray[top++] = item; 
  return true; 
} 
 
template<typename Elem> 
Elem PathStack<typename Elem>::pop(){ 
  Elem it; 
  if(top == 0) return it; 
  it = listArray[--top];  
  return it; 
} 
 
template<typename Elem> 
Elem PathStack<typename Elem>::topValue() const{ 
  Elem it; 
  if(top == 0) return it; 
  it = listArray[top - 1]; 
  return it; 
} 

  2:如何實(shí)現(xiàn)路徑的尋找

     1:設(shè)定尋找的方向,可以使用一個(gè)判斷語句;判斷起始位置周圍哪個(gè)地方有路就將該位置的坐標(biāo)加入到棧中,并將該位置標(biāo)記(將改位置值改為2,既將走過的位置標(biāo)記為2)

     2:判斷該位置周圍是否還有路,若沒有則退棧即退回到上一個(gè)位置;并將該位置做下另一個(gè)標(biāo)記(將該位置值改為3,既將退棧位置值用3標(biāo)記)

     3:重復(fù)1,2步驟直到達(dá)到出口

     路徑尋找的類: 

//迷宮求解的方法類 
//功能:通過findPath() 方法實(shí)現(xiàn)對路徑的查找 
//       通過printPath()方法將路徑打印出來 
#include "PathStack.h" 
#include <iostream> 
using namespace std; 
 
class MazeSolveMethod 
{ 
private: 
  static int maze[10][10];//存放迷宮數(shù)據(jù) 
  PathStack<int> pathStack;//定義棧 
public: 
  MazeSolveMethod():pathStack(100){ 
  } 
  ~MazeSolveMethod(){ } 
  void findPath(int startX,int startY); 
  void printPath() const; 
}; 
 
int MazeSolveMethod::maze[10][10] = { 
  {1,1,1,1,1,1,1,1,1,1}, 
  {1,0,0,1,1,0,0,0,0,1}, 
  {1,0,0,0,1,0,1,0,0,1}, 
  {1,0,1,0,0,0,1,1,0,1}, 
  {1,0,1,0,0,0,1,1,1,1}, 
  {1,0,1,1,1,0,1,1,1,1}, 
  {1,0,1,1,1,0,1,1,1,1}, 
  {1,1,1,1,1,0,0,0,1,1}, 
  {1,1,1,1,1,1,1,0,0,1}, 
  {1,1,1,1,1,1,1,1,1,1}, 
}; 
 
void MazeSolveMethod::findPath(int startX,int startY){ 
  int x = startX; 
  int y = startY; 
  pathStack.push(x); 
  pathStack.push(y); 
  maze[x][y] = 2; 
  cout<<"進(jìn)入方法!"<<endl; 
  while(true){ 
    if(maze[x-1][y] == 0){ 
      pathStack.push(--x); 
      pathStack.push(y); 
      maze[x][y] = 2; 
    }else if(maze[x][y-1] == 0){ 
      pathStack.push(x); 
      pathStack.push(--y); 
      maze[x][y] = 2; 
    }else if(maze[x][y+1] == 0){ 
      pathStack.push(x); 
      pathStack.push(++y); 
      maze[x][y] = 2; 
    }else if(maze[x+1][y] == 0){ 
      pathStack.push(++x); 
      pathStack.push(y); 
      maze[x][y] = 2; 
    } 
    if(maze[x-1][y] != 0 && maze[x][y+1] != 0 && maze[x+1][y] != 0 && maze[x][y-1] != 0){         
      if(x >= 8 && y >= 8){ 
        break; 
      }else{ 
        maze[x][y] = 3; 
        y = pathStack.pop(); 
        x = pathStack.pop(); 
      } 
      y = pathStack.topValue(); 
      int temp = pathStack.pop(); 
      x = pathStack.topValue(); 
      pathStack.push(temp); 
    } 
  } 
} 
 
void MazeSolveMethod::printPath() const{ 
  cout<<"printPath"<<endl; 
  for(int i=0; i<10; i++){ 
    for(int j=0; j<10; j++){ 
      if(maze[i][j] == 2) 
        cout<<'*'<<" "; 
      else if(maze[i][j] == 3) 
        cout<<0<<" "; 
      else 
        cout<<1<<" "; 
    } 
    cout<<endl; 
  } 
} 

   主函數(shù)類 

/************************************************************************/ 
/*迷宮求解----棧方法實(shí)現(xiàn)*/ 
//功能:通過對棧實(shí)現(xiàn)迷宮算法求解 
//Author:Andrew 
//Date  :2012-10-20 
/************************************************************************/ 
#include "MazeSolveMethod.h" 
#include <iostream> 
using std::cout; 
using std::endl; 
 
int main(){ 
 
  MazeSolveMethod solve; 
  solve.findPath(1,1); 
  solve.printPath(); 
  system("pause"); 
  return 0; 
} 

 將上面的代碼運(yùn)行后結(jié)果截圖如下:

 其中* 為路徑 

 

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • c++ #include是怎么樣工作的?

    c++ #include是怎么樣工作的?

    大多數(shù)園友可能對“#include”比較熟悉,因?yàn)槲覀儗慍/C++程序的時(shí)候都會寫的字符串之一,但是它是具體怎么工作的?或者它的原理是什么呢?
    2013-01-01
  • C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決

    C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決

    這篇文章主要介紹了C++中string轉(zhuǎn)換為char*類型返回后亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C++11?constexpr使用詳解

    C++11?constexpr使用詳解

    constexpr是一種比const?更嚴(yán)格的束縛,?它修飾的表達(dá)式本身在編譯期間可知,?并且編譯器會盡可能的?evaluate?at?compile?time,本文重點(diǎn)給大家介紹C++11?constexpr使用,需要的朋友可以參考下
    2021-12-12
  • Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細(xì)介紹了Windows安裝配置C/C++,OpenSSL開發(fā)環(huán)境配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • VS2022添加代碼模板的實(shí)現(xiàn)步驟(圖文)

    VS2022添加代碼模板的實(shí)現(xiàn)步驟(圖文)

    使用代碼模板即可實(shí)現(xiàn)像內(nèi)置函數(shù)那樣,只需寫幾個(gè)字母,便能提示自動補(bǔ)全,本文主要介紹了VS2022添加代碼模板的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2024-06-06
  • C++入門到精通之循環(huán)語句的使用教程

    C++入門到精通之循環(huán)語句的使用教程

    這篇文章主要給大家介紹了關(guān)于C++中循環(huán)語句的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā)

    C語言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)商品管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C 語言基礎(chǔ)教程(我的C之旅開始了)[二]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[二]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[二]...
    2007-02-02
  • 詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼

    詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼

    多態(tài)是C++中最重要的特性之一,對虛函數(shù)的調(diào)用在C++代碼中是隨處可見的,本篇文章我們詳細(xì)探討一下,感興趣的朋友快來看看吧
    2021-11-11
  • c++連接mysql數(shù)據(jù)庫的兩種方法(ADO連接和mysql api連接)

    c++連接mysql數(shù)據(jù)庫的兩種方法(ADO連接和mysql api連接)

    現(xiàn)在正做一個(gè)接口,通過不同的連接字符串操作不同的數(shù)據(jù)庫。要用到mysql數(shù)據(jù)庫,C++連接mysql有2種方法:利用ADO連接、利用mysql自己的api函數(shù)進(jìn)行連接,下面看看如何用吧
    2013-12-12

最新評論