1. 程式人生 > >資料結構——棧——迷宮(c++)

資料結構——棧——迷宮(c++)

迷宮旅行遊戲

專案簡介

迷宮只有兩個門,一個門叫入口,另一個門叫出口。一個騎士騎馬從入口走進迷宮,迷宮中設定很多牆壁,對前進方向形成了多處障礙。騎士需要在迷宮中尋找通路以到達出口。

設計思路

迷宮問題的求解過程可以採用回溯法即在一定的約束條件下試探地搜尋前進,若前進中受阻,則及時回頭糾正錯誤另擇通路繼續搜尋的方法。從入口出發,按某一方向向前探索,若能走通(未走過的),即某處可達,則到達新點,否則試探下一方向;若所有的方向均沒有通路,則沿原路返回前一點,換下一個方向再繼續試探,直到所有可能的通路都探索到,或找到一條通路,或無路可走又返回到入口點。

在求解過程中,為了保證在到達某一點後不能向前繼續行走(無路)時,能正確返回前一點以便繼續從下一個方向向前試探,則需要在試探過程中儲存所能夠到達的每一點的下標及從該點前進的方向,當找到出口時試探過程就結束了。

為了確保程式能夠終止,調整時,必須保證曾被放棄過的填數序列不被再次試驗,即要求按某種有序模型生成填數序列。給解的候選者設定一個被檢驗的順序,按這個順序逐一生成候選者並檢驗。

資料結構

迷宮問題是棧應用的一個典型例子。通過前面分析,我們知道在試探過程中為了能夠沿著原路逆序回退,就需要一種資料結構來儲存試探過程中曾走過的點的下標及從該點前進的方向,在不能繼續走下去時就要退回前一點繼續試探下一個方向,棧底元素是入口,棧頂元素是回退的第一站,也即後走過的點先退回,先走過的點後退回,與棧的“後進選出,先進後出”特點一致,故在該問題求解的程式中可以採用棧這種資料結構。在迷宮有通路時,棧中儲存的點逆序連起來就是一條迷宮的通路,否則棧中沒有通路。


demo.cpp

# include <iostream>
#include "mStack.h"
using namespace std;


int main()
{
	mPoint mpArray[10][10];
	bool initArray[10][10] = { 
	{ false,false,false,false,false,false,false,false,false,false },
	{ false,true ,true ,false,true ,true ,true ,false,true ,false },
	{ false,true ,true ,false,true ,true ,true ,false,true ,false },
	{ false,true ,true ,true ,true ,false,false,true ,true ,false },
	{ false,true ,false,false,false,true ,true ,true ,true ,false },
	{ false,true ,true ,true ,false,true ,true ,true ,true ,false },
	{ false,true ,false,true ,true ,true ,false,true ,true ,false },
	{ false,true ,false,false,false,true ,false,false,true ,false },
	{ false,true,true ,true ,true ,true ,true ,true ,true ,false },
	{ false,false,false,false,false,false,false,false,false,false } };//迷宮矩陣
	for (int i = 0; i<10; i++)
		for (int j = 0; j<10; j++)
		{
			mpArray[i][j].x = i;
			mpArray[i][j].y = j;
			mpArray[i][j].can_move_to = initArray[i][j];
		}
	mPoint startp(1, 1, true);//初始座標(入口)
	mPoint endp(8, 8, true);  //結束座標(出口)

	mStack mpath;//定義物件
	mpath.push(startp);//把初始座標入棧

	mPoint mp = startp;//記錄當前座標
	while (true)
	{
		if (mp.x == endp.x && mp.y == endp.y)
			break;//成功出迷宮
		if (mpArray[mp.x + 1][mp.y].can_move_to)//向下
		{
			mpArray[mp.x + 1][mp.y].can_move_to = false;//將走過的路標記為false
			mpath.push(mPoint(mp.x + 1, mp.y));
			mp = mpArray[mp.x + 1][mp.y];
			continue;
		}
		if (mpArray[mp.x - 1][mp.y].can_move_to)//向上
		{
			mpArray[mp.x - 1][mp.y].can_move_to = false;
			mpath.push(mPoint(mp.x - 1, mp.y));
			mp = mpArray[mp.x - 1][mp.y];
			continue;
		}
		if (mpArray[mp.x][mp.y + 1].can_move_to)//向右
		{
			mpArray[mp.x][mp.y + 1].can_move_to = false;
			mpath.push(mPoint(mp.x, mp.y + 1));
			mp = mpArray[mp.x][mp.y + 1];
			continue;
		}
		if (mpArray[mp.x][mp.y - 1].can_move_to)//向左
		{
			mpArray[mp.x][mp.y - 1].can_move_to = false;
			mpath.push(mPoint(mp.x, mp.y - 1));
			mp = mpArray[mp.x][mp.y - 1];
			continue;
		}
		if (0 == mpath.getLength())//棧空
		{
			cout << "沒有路" << endl;
			return -1;
		}
		mpath.pop();
		mp = mpath.getTop();
	}
	cout << "路徑:" << endl;
	mpath.printStack();//輸出路徑

	return 0;
}



mStack.h

<span style="font-size:12px;color:#000000;">#include <iostream>
using namespace std;

struct mPoint
{
	int x;
	int y;
	bool can_move_to;
	mPoint(int rx = 0, int ry = 0, bool rcan_move_to = false)
	{
		x = rx;
		y = ry;
		can_move_to = rcan_move_to;
		next = NULL;
	}
	mPoint *next;
};
class mStack
{
public:
	mStack();//建構函式
	int push(mPoint point);//入棧
	mPoint pop();//出棧
	int getLength();//長度
	mPoint getTop();//棧頂
	void printStack();//遍歷
private:
	mPoint *base;//基指標
	mPoint *top; //頂指標
	int length; //棧長度
};</span>

mStack.cpp

<span style="font-size:12px;color:#000000;">#include "mStack.h"
#include <iostream>
using namespace std;


mStack::mStack()
{
	length = 0;
	base = NULL;
	top = NULL;
}
int mStack::push(mPoint point)
{
	mPoint *mpNode = new mPoint();
	*mpNode = point;
	if (length == 0)
		top = base = mpNode;
	else
	{
		top->next = mpNode;
		top = mpNode;
	}
	return ++length;
}
mPoint mStack::getTop()
{
	return *top;
}
mPoint mStack::pop()
{
	if (length <= 0)
		return NULL;
	mPoint retPoint = *top;
	top = base;
	while (top->next != NULL)
	{
		if (top->next->next == NULL)
		{
			delete(top->next);
			top->next = NULL;
			break;
		}
		top = top->next;
	}
	if (length == 1)
	{
		delete(base);
		base = top = NULL;
	}
	length--;
	return retPoint;
}

int mStack::getLength()
{
	return length;
}
void mStack::printStack()
{
	mPoint *p = base;
	while (p != NULL)
	{
		cout << "(" << p->x << "," << p->y << ")" << endl;
		p = p->next;
	}

}</span>


相關推薦

資料結構————迷宮c++

迷宮旅行遊戲 專案簡介 迷宮只有兩個門,一個門叫入口,另一個門叫出口。一個騎士騎馬從入口走進迷宮,迷宮中設定很多牆壁,對前進方向形成了多處障礙。騎士需要在迷宮中尋找通路以到達出口。 設計思路 迷宮問題的求解過程可以採用回溯法即在一定的約束條件下試探地搜尋前進,若前進中受

資料結構——連結串列c++

myList.h template <class T> class List { void clear(); // 置空線性表 bool isEmpty();

資料結構補充題C++帶答案

補充習題:第一章 1.資料結構是研究資料的( C )以及它們之間的相互關係。   A)儲存結構,物理結構    B)理想結構,抽象結構   C)物理結構,邏輯結構    D)抽象結構,邏輯結構 2.在資料結構中,與所使用的計算機無關的是資料的( C )結構。   A)儲存

資料結構之堆疊c

相關知識 1.函式封裝 2.堆疊(先進後出,後進先出) 3.指標(記憶體申請,結構體運用) 標頭檔案及其宣告 #ifndef STACKLIST_H_INCLUDED #define STAC

資料結構應用數制轉換

問題: 十進位制如何轉換成二進位制 十進位制如何轉換成八進位制 十進位制如何轉換成十六進位制 十進位制數N和其他d進位制數的轉換的原理為N=(N div d)* d + N mod d* 比如十進位制的數字10轉換為二進位制口算就知道是1010,那按照

案例3.2:括號匹配的檢驗c++實現/資料結構/的基本操作

#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status

資料結構與演算法2—— java

1 棧的實現 1.1 簡單陣列實現棧 package mystack; public class ArrayStack { private int top; //當前棧頂元素的下標 private int[] array; public ArraySt

資料結構複習筆記——靜態順序表C語言

定義結構體 typedef struct{ int data[MAXSIZE]; //MAXSIZE為最大容量 int length; //當前長度 } Array; 建立順序表 /* 需要接受一個已知的陣列,以及該陣列的長度 按順序將陣列內的值,賦給順

資料結構與演算法-揹包、和佇列

  前言:許多基礎資料型別都和物件的集合有關。具體來說,資料型別的值就是一組物件的集合,所有操作都是關於新增、刪除或是訪問集合中的物件。而且有很多高階資料結構都是以這樣的結構為基石創造出來的,在本文中,我們將瞭解學習三種這樣的資料型別,分別是揹包(Bag)、棧(Stack)和佇列(Queue) 一、學習感悟

小白的資料結構程式碼實戰6----共享

共享棧=棧1+棧2 棧1的棧底為共享棧的首,棧2的棧底為共享棧的尾 共享棧滿:S->top1+1==S->top2 //Author:張佳琪 #include <stdio.h> #include <stdlib.h> #define

資料結構與演算法3- C++ STL與java se中的vector

宣告:雖然本系列部落格與具體的程式語言無關。但是本文作者對c++相對比較熟悉,其次是java,所以難免會有視角上的偏差。舉例也大多是和這兩門語言相關。 上一篇部落格概念性的介紹了vector,我們有了大致的印象:vector不過就是看上去可以自增長的陣列麼。這篇部落格將稍微

大二上期資料結構實驗記錄【初版】C實現簡單一元多項式加減乘求導及代值計算有借鑑刪改

想要記錄自己程式設計思維的成長所以發到部落格,歡迎並且感激大家指出缺點和錯誤! 一、【實驗構思(Conceive)】 本次實驗要求是用C或C++語言設計並實現一個一元稀疏多項式的簡單計算器,要求是要有如下功能 1、輸入並建立多項式 2、輸出多項式,序列按指數降序

資料結構與演算法C語言 | 二叉排序樹

二叉排序樹的定義—— 二叉排序樹 ( Binary Sort Tree) 或者為空;或者是具有如下特性的二叉樹: (1)若根的左子樹不空,則左子樹上所有結點的關鍵字均小於根結點的關鍵字; (2)若

資料結構題集C語言版》電子書下載 -百度網盤 高清版PDF格式

     作者:嚴蔚敏,吳偉民,米寧 出版日期:1999-2-1 出版社:清華出版社 頁數:234 ISBN:9787302033141 檔案格式:PDF 檔案大小:18.13 MB     本

資料結構-順序佇列C語言

佇列:插入資料只在隊尾進行,刪除資料只在隊頭進行。 順序佇列操作會出現 假溢位(tail指向佇列最後,進行入隊操作時,即使前面有空位置也顯示佇列已滿) 解決: 1.在出隊操作後,增加移動元素操作。每次進行完出隊操作後,佇列中後面的元素向前移動,始終保持佇列第一個位置有元素。

資料結構與演算法列表結構以及與佇列

列表結構:要求各元素在邏輯上具有線性次序,但對其實體地址未作任何要求即動態儲存策略。 數值,前驅和後繼。List的私有頭結點和尾節點始終存在,卻對外不可見。 插入排序:字首有序,字尾無序。將字尾元素插入到字首中的合適位置。藉助於有序序列的查詢演算法。穩定演算法。O(n*n) 選擇排序:字

簡單易懂的迷宮走法--應用c++

哈嘍~小夥伴們,你們帥氣的阿俊又回來啦,他有好東西和你們分享哦,那就是困擾了他好久的迷宮問題。感覺自己走迷宮時簡單得很,可讓計算機走咋這麼難哩,我明白了,一定是因為計算機太笨了,真是笨死了,啥都要人家一步步教他咋做,還想取代人?路漫漫其修遠兮哦,嘿嘿嘿,那我們看看咋教他走迷宮吧!

資料結構】樹:B樹C++實現

> 《演算法導論》學習 基本介紹 B樹是為磁碟或者其他直接存取的輔助儲存(secondary storage)裝置而設計的平衡搜尋樹。B樹類似於紅黑樹,但是在降低磁碟I/O運算元方面表現更好。許多資料庫系統使用B樹或其變種來儲存資訊。 一個

資料結構之陣列C語言實現

陣列是大家很熟悉的一種資料型別,而且在我們的程式設計中也應用非常廣泛。這裡以抽象資料型別的形式討論陣列的定義和實現。 一、陣列的定義 假設n維陣列中含有第i維的長度為b(i),則陣列的總長度為b(0) *b(1)*...*b(n-1),每個元素都受著n個

【原始碼】C++實現嚴蔚敏資料結構所有演算法線性表-順序表

日常說明:首先博主也是菜鳥一枚,有錯誤歡迎大家指正。另外本部落格所有的程式碼博主編寫後均除錯 通過。重要提醒!!!!博主使用的是VS2017,如果有低版本的小夥伴 最好新建空專案將此程式碼複製上去。 附加說明:最初的程式碼我沒有嚴格的按照專案規範來分離,希望