C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn)
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn),供大家參考,具體內(nèi)容如下
分析:迷宮實(shí)驗(yàn)主要有兩部分操作,其一是對(duì)迷宮的生成,其二是尋路使用棧的操作。
步驟:
一、.h文件
1、首先是迷宮的生成,可以使用隨機(jī)數(shù)種子生成,但主要邏輯部分并不在此,所以在這里直接寫死,固定下來。
定義一個(gè)坐標(biāo)類型的結(jié)構(gòu)體,和二維數(shù)組迷宮:
typedef struct { int x; int y; }Pos; //迷宮類型 typedef struct { int square[10][10] = { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,0,1,1,1,0,1}, {1,0,0,0,0,1,0,1,0,1}, {1,0,1,1,1,1,0,1,1,1}, {1,0,0,0,0,1,0,0,0,1}, {1,0,1,1,0,0,0,1,0,1}, {1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}, }; }Maze; typedef Pos SElemType;
2、然后是對(duì)棧的聲明,棧里儲(chǔ)存的元素為坐標(biāo)類型
//順序棧 #define MAXSIZE 50 typedef struct { SElemType *base; SElemType *top; //棧頂指針 int stacksize; }SqStack;
3、棧操作函數(shù)聲明
typedef int Status; #define OK 1; #define ERROR 0; //棧的相關(guān)操作 //初始化棧 Status initStack(SqStack &s); //壓棧 Status push(SqStack &s, SElemType e); //出棧 SElemType pop(SqStack &s); //清空棧 Status clearStack(SqStack &s); //摧毀棧 void destroyStack(SqStack &s); //遍歷棧 Status stackTravel(SqStack s);
4、迷宮操作函數(shù)聲明
//初始化迷宮(同時(shí)生成起始點(diǎn)和終點(diǎn)) void initMaze(Maze &maze); //打印迷宮 void showMaze(Maze maze); //尋找出路;傳入一個(gè)迷宮和棧找出出路 void findWay(Maze &maze,SqStack &s); //判斷該點(diǎn)的四個(gè)方向是否有通路,有就前進(jìn) Pos isExit(Pos p, Maze maze);
二、.cpp文件
1、導(dǎo)入所需頭文件
#include "pch.h" #include <iostream> #include<time.h> #include<stdlib.h> using namespace std;
2、棧操作實(shí)現(xiàn)
//構(gòu)造空棧 Status initStack(SqStack &s) { s.base = new SElemType[MAXSIZE]; if (!s.base) { exit(OVERFLOW);//分配失敗 } s.top = s.base; s.stacksize = MAXSIZE; return OK; } //入棧 Status push(SqStack &s, SElemType e) { //判斷棧滿 if (s.top-s.base == s.stacksize) { return ERROR; } //存入元素,*為取指針的值 s.top++; *s.top = e; return OK; } //出棧,用e返回棧頂值 SElemType pop(SqStack &s) { SElemType e; //判斷棧為空 if (s.top == s.base) { //若為空則返回一個(gè)(-1,-1)的點(diǎn),判斷由外部調(diào)用時(shí)進(jìn)行 e.x = -1; e.y = -1; return e; } e = *s.top; s.top--; return e; } Status clearStack(SqStack &s) { s.top = s.base; return OK; } void destroyStack(SqStack &s) { s.top = NULL; s.stacksize = 0; free(s.base); } Status stackTravel(SqStack s) { while (s.top != s.base) { s.base++; Pos p = *s.base; //輸出走過的路徑 cout <<"("<<p.x<<","<<p.y<<")"<< "-->"; if ( p.x == 0 || p.y == 0|| p.x == 9 ||p.y == 9) { //終點(diǎn)輸出為“End” cout << "End"; } } cout << endl; return 0; }
3、迷宮操作實(shí)現(xiàn)
///////////////////////////////////////迷宮操作//////////////////////////////// //初始化函數(shù),傳入一個(gè)迷宮,隨機(jī)生成起點(diǎn)和終點(diǎn),由于起點(diǎn)有一定限制,所以這里起點(diǎn)也固定為幾個(gè)最合適的點(diǎn) void initMaze(Maze &maze) { //生成隨機(jī)數(shù) srand((unsigned)time(NULL)); int index = rand() % 36 + 1; int start = index % 6 + 1; //生成起始點(diǎn)數(shù)值為‘s' switch (start) { case 1: maze.square[1][1] = 's'; break; case 2: maze.square[3][8] = 's'; break; case 3: maze.square[3][6] = 's'; break; case 4: maze.square[6][8] = 's'; break; case 5: maze.square[8][3] = 's'; break; case 6: maze.square[8][8] = 's'; break; } //隨機(jī)生成終點(diǎn)'e'表示 while (index = rand()%36+1) { //出口在頂部 if (index >1 &&index<10 && maze.square[1][index-1]!='s') { maze.square[0][index-1] = 'e'; break; } //出口在右側(cè) else if (index>10 &&index <19) { if (maze.square[index-10][8] != 1 && maze.square[index-10][8]!='s') { maze.square[index-10][9] = 'e'; break; } } //底部出口 else if (index >19&&index<28) { if (maze.square[8][index - 19] != 's' && maze.square[8][index - 19] != 1) { maze.square[9][index - 19] = 'e'; break; } } //左側(cè)出口 else if (index >28 && index <=36) { if (maze.square[index-28][1] != 1 &&maze.square[index-28][1] != 's') { maze.square[index - 28][0] = 'e'; break; } } } } void showMaze(Maze maze) { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (maze.square[i][j] == 1) { cout << "* "; } else if (maze.square[i][j] == 0) { cout << " "; } else { cout << (char)maze.square[i][j]<<" "; } } cout << endl; } } //尋找迷宮路徑 void findWay(Maze &maze,SqStack &s) { //首先遍歷找出起始點(diǎn)和終點(diǎn)并保存下來 Pos start,end; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (maze.square[i][j] == 's') { //起點(diǎn)壓入棧內(nèi) start.x = i; start.y = j; push(s, start); } else if (maze.square[i][j] == 'e') { //出口 end.x = i; end.y = j; } } } //尋找路徑 Pos go = start; //直到找到出口才結(jié)束 while ( s.top->x != end.x || s.top->y != end.y) { //獲得下一步坐標(biāo) Pos path = isExit(go, maze); if (path.x != go.x || path.y != go.y) { //前進(jìn) maze.square[path.x][path.y] = 'p'; push(s, path); go = path; } //如果所有放向都走不通(即返回的點(diǎn)是傳入的點(diǎn)),則將其標(biāo)為“@”,出棧到上一個(gè)點(diǎn),繼續(xù)判斷 else { //走不通pop maze.square[path.x][path.y] = '@'; pop(s); go = *s.top; } } maze.square[end.x][end.y] = 'e'; } //判斷返回下一步路徑(順序:右下左上),傳入所處位置,從右邊開始判斷是否又通路或者出口,有就返回哪個(gè)方向上的點(diǎn) Pos isExit(Pos p,Maze maze) { Pos tempP = p; if (maze.square[tempP.x][tempP.y+1] == 0 || maze.square[tempP.x][tempP.y + 1] == 'e') { tempP.y++; } else if(maze.square[tempP.x+1][tempP.y] == 0 || maze.square[tempP.x +1][tempP.y] == 'e') { tempP.x++; } else if (maze.square[tempP.x][tempP.y - 1] == 0 || maze.square[tempP.x][tempP.y - 1] == 'e') { tempP.y--; } else if (maze.square[tempP.x - 1][tempP.y] == 0 || maze.square[tempP.x - 1][tempP.y] == 'e') { tempP.x--; } return tempP; }
三、main函數(shù)調(diào)用
int main() { while (true) { //創(chuàng)建一個(gè)迷宮 Maze maze; initMaze(maze); //初始化一個(gè)棧 SqStack S; initStack(S); cout << "*****************************" << endl; cout << "* 1、生成迷宮 2、退出 *" << endl; cout << "*****************************" << endl; cout << "請(qǐng)輸入你的選擇:"; int select = 0; cin >> select; if (select == 1) { cout << "生成隨機(jī)起點(diǎn)和出口迷宮:" << endl; showMaze(maze); cout << "生成迷宮路徑:" << endl; findWay(maze, S); stackTravel(S); showMaze(maze); cout << endl; } if (select == 2) { clearStack(S); break; } } return 0; }
四、評(píng)價(jià)
這是個(gè)叫簡(jiǎn)易的迷宮,但基本實(shí)現(xiàn)了迷宮的尋路邏輯,可改進(jìn)的地方有:
1、因?yàn)楹芏嗟胤綄懰懒?,所以?fù)用性不高,可以用循環(huán)遍歷來隨機(jī)生成起點(diǎn),同理迷宮的生成也是這樣
2、判斷路徑可以用遞歸調(diào)用實(shí)現(xiàn)前進(jìn)邏輯
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C語言實(shí)現(xiàn)任何文件的加密解密功能
欄 目:C語言
下一篇:詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)
本文標(biāo)題:C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/378.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文