迷宮遊戲 用棧實現
#include<iostream> #include<string> #include<stack> using namespace std; #define n 8 stack <int *> s; int * createMaze(){//初始化迷宮 int i,j; int * a; a=new int[n*n]; for(i=0;i<n;i++){ for(j=0;j<n;j++){ *(a+n*i+j)=-1;//不設定為0的原因是超過矩陣範圍的位置 } //系統預設的是0,會引起麻煩 } *(a+n*0+1)=3;s.push(a+n*0+1);//當前位置入棧 *(a+n*1+1)=1;*(a+n*1+2)=1;*(a+n*1+3)=1;*(a+n*1+5)=1; *(a+n*2+3)=1;*(a+n*2+4)=1;*(a+n*2+5)=1;*(a+n*2+6)=1; *(a+n*3+1)=1;*(a+n*3+2)=1;*(a+n*3+3)=1;*(a+n*3+5)=1; *(a+n*4+1)=1;*(a+n*4+4)=1; *(a+n*5+1)=1;*(a+n*5+2)=1;*(a+n*5+4)=1;*(a+n*5+5)=1;*(a+n*5+6)=1; *(a+n*6+2)=1;*(a+n*6+3)=1;*(a+n*6+4)=1;*(a+n*6+6)=1; *(a+n*7+6)=1; return a; } //程式中標記-1,1,2,3,4的值表示意義如下: //-1:障礙物(方塊) //1:可行走的通道且還未曾被五角星通過 //2:五角星走過的通道(這樣說不完全準確),更準確的說是已經壓棧的元素(地址) //3:標識五角星 //4:遇到再也走不通的位置,離開時所填充的障礙(與-1的作用相同,但是不顯示出來) void printMaze(int * a){//列印迷宮 int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(*(a+n*i+j)==1||*(a+n*i+j)==2||*(a+n*i+j)==4){ cout<<" "; } else if(*(a+n*i+j)==3){ cout<<"★"; } else{//*(a+n*i+j)==-1 cout<<"■"; } } cout<<endl; } } void run(int * a,char ch){ int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(*(a+n*i+j)==3){ switch(ch){ case 'w': if(*(a+n*(i-1)+j)==1){ *(s.top())=2; s.push(a+n*(i-1)+j);//入棧 *(s.top())=3; } if(*(a+n*(i-1)+j)==2){ *(s.top())=-1; s.pop();//出棧 *(s.top())=3; } return; case 'a': if(*(a+n*i+j-1)==1){ *(s.top())=2; s.push(a+n*i+j-1);//入棧 *(s.top())=3; } if(*(a+n*i+j-1)==2){ *(s.top())=-1; s.pop();//出棧 *(s.top())=3; } return; case 's': if(*(a+n*(i+1)+j)==1){ *(s.top())=2; s.push(a+n*(i+1)+j);//入棧 *(s.top())=3; } if(*(a+n*(i+1)+j)==2){ *(s.top())=-1; s.pop();//出棧 *(s.top())=3; } return; case 'd': if(*(a+n*i+j+1)==1){ *(s.top())=2; s.push(a+n*i+j+1);//入棧 *(s.top())=3; } if(*(a+n*i+j+1)==2){ *(s.top())=-1; s.pop();//出棧 *(s.top())=3; } return; } } } } } char getDirection(int * a){//得到方向 int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(*(a+n*i+j)==3){ //必須按優先順序排列 if(*(a+n*i+j+1)==1){ return 'd'; } if(*(a+n*(i+1)+j)==1){ return 's'; } if(*(a+n*i+j-1)==1){ return 'a'; } if(*(a+n*(i-1)+j)==1){ return 'w'; } if(*(a+n*i+j+1)==2){ return 'd'; } if(*(a+n*(i+1)+j)==2){ return 's'; } if(*(a+n*i+j-1)==2){ return 'a'; } if(*(a+n*(i-1)+j)==2){ return 'w'; } else{ cout<<"無效按鍵"<<endl; } } } } } int handle(){ int * a; int count=1; string step;//用string是為了避免使用者多輸入字元而引起錯誤 a=createMaze(); printMaze(a); cout<<"請按任意鍵進行下一步!"<<endl; while(*(a+n*7+6)!=3){ cout<<"第"<<count<<"步:"; cin>>step; run(a,getDirection(a)); printMaze(a); count++; } cout<<"恭喜你,順利到達終點!"<<endl; return 0; } int main(){ handle(); return 0; }
相關推薦
迷宮遊戲 用棧實現
#include<iostream> #include<string> #include<stack> using namespace std; #define n 8 stack <int *> s; int * cre
用棧實現迷宮遊戲尋路
在我們學習資料結構的時候都曾經見過迷宮遊戲,迷宮遊戲的實現其實並不難,但是,我們在實現每一個演算法的時候都應該想一想這個問題的每一個解。最近,博主已經開始重溫資料結構啦,記得我們以前學習這裡的時候,老師會用佇列來實現迷宮最優解的尋找,氮素呢,博主就是這麼可愛,博主就是
數據結構設計——用棧實現迷宮問題的求解
src 實驗代碼 AC pan -- \n strong AI end 求解迷宮問題 1,問題描述 以一個m*n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。迷宮問題要求求出從入口(1,1)到出口(m,n)的一條通路,或得出沒有通路的結論。 基本要求: 首先實
資料結構之用棧實現迷宮問題(dfs)
給一個n*n的方格,讓你求從左上角到所給一點的任意一條路徑並輸出 該題用到dfs,以下是對dfs的簡要解析 :詳解請參見 傳送門 dfs是一種用於遍歷或搜尋樹或圖的演算法。 沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不
《資料結構》嚴蔚敏 用棧實現迷宮求解問題
轉載:https://blog.csdn.net/Vit_rose/article/details/52781116 膜大佬~ 其實自己就是懶,太懶了,不想動手寫,有畏難情緒,這個毛病得改鴨 思路:利用棧窮舉路徑,從而來得到問題的解答 注意:當前路徑可通,指未曾走到過的通道塊(即不能是已經壓
java用棧實現迷宮
迷宮實現演算法: package algrithm; import java.util.Scanner; public class maze { public static void main(String[] args) { int a[][]={
【資料結構】簡單不帶環迷宮的實現(用棧實現)
一.用棧來實現簡單的迷宮1. 迷宮:回溯法:對一個包括有很多個結點,每個結點有若干個搜尋分支的問 題,把原問題分解為若干個子問題求解的演算法;當搜尋到某個結點發 現無法再繼續搜尋下去時,就讓搜尋過程回溯(回退)到該節點的前一 個結點,繼續搜尋該節點外的其他尚未搜尋的分支;
Java之用棧實現隊列
ring idt style enqueue 元素 java 出隊 入隊 span 隊列是一種典型的先進先出數據結構,隊列的實現方式有很多種,比如數組,比如鏈表等,隊列也可以用兩個棧來實現,下面就用兩個棧實現一個隊列。 原理 兩個棧中,一個棧用來入隊,叫他入隊棧,另
用棧實現隊列
isempty row exce 數據 如果 throw 一個 異常 移動 實現思想:對於A,B兩個棧,A作為壓棧,B作為彈出棧。push操作時,將結果壓入A棧,並且判斷B棧是否為空,如果為空,則將A棧的元素全部移動到B棧pop操作時,判斷A,B棧是否為空,如果同時為空,則
LeetCode232之用棧實現佇列(Implement Queue using Stacks)
一、題目 二、一種解題思路 1)介紹:雙棧實現佇列法 方法解析:使用兩個棧做為基礎,一個棧儲存輸入的元素,另外一個棧將前面棧中的元素儲存到自己中,這樣就實現了佇列的效果,最先進的元素在in棧的棧底,out棧的棧頂。 ()從一個棧到另外一個棧的操作,僅在out
【LeetCode 簡單題】62-用棧實現佇列
宣告: 今天是第62道題。使用棧實現佇列的相關操作。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:使用棧實現佇列的下列操作:
LeetCode232 棧·用棧實現佇列(C++)
題目描述: 使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new MyQueue()
LR--用棧實現移進--歸約分析(demo)
1.考慮文法 \(E->E+E\) \(E->E*E\) \(E->id\) 2.最右推導 不難看出,這個文法是而二義的,所以有多個最右推導 3.移進歸約 用一個棧存文法符號,用輸入快取區儲存要分析的輸入串,用$標記棧底 #include<iostream> #inc
佇列&棧//用棧實現佇列
使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new MyQue
用棧實現的計算器最終版本(可以實現括號以及浮點數的運算)
1 #include <stdio.h> 2 #include <ctype.h> 3 #include <stdlib.h> 4 5 #define STACK_INIT_SIZE 20 6 #define STACKINCREMENT
LeetCode232用棧實現佇列c++
使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new
【LeetCode題解】232_用棧實現隊列(Implement-Queue-using-Stacks)
復雜 彈出 兩個棧 art 分析 完成後 棧操作 all n) 目錄 描述 解法一:在一個棧中維持所有元素的出隊順序 思路 入隊(push) 出隊(pop) 查看隊首(peek) 是否為空(empty) Java 實現 Python 實現 解法二:一個棧入,一個棧出
【LeetCode題解】232_用棧實現佇列(Implement-Queue-using-Stacks)
目錄 描述 解法一:在一個棧中維持所有元素的出隊順序 思路 入隊(push) 出隊(pop) 檢視隊首(peek) 是否為空(empty) Java 實現 Python 實現 解法二:一
用棧實現佇列_學習記錄
用棧實現佇列_學習記錄 【題目描述】 使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。
LeetCode232 用棧實現佇列
使用棧實現佇列的下列操作: push(x) -- 將一個元素放入佇列的尾部。 pop() -- 從佇列首部移除元素。 peek() -- 返回佇列首部的元素。 empty() -- 返回佇列是否為空。 示例: MyQueue queue = new MyQueue(); qu