亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現數據結構迷宮實驗

2020-01-26 13:30:05
字體:
來源:轉載
供稿:網友

本文實例為大家分享了C語言實現簡單的數據結構迷宮實驗,供大家參考,具體內容如下

分析:迷宮實驗主要有兩部分操作,其一是對迷宮的生成,其二是尋路使用棧的操作。

步驟:

一、.h文件

1、首先是迷宮的生成,可以使用隨機數種子生成,但主要邏輯部分并不在此,所以在這里直接寫死,固定下來。
定義一個坐標類型的結構體,和二維數組迷宮:

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、然后是對棧的聲明,棧里儲存的元素為坐標類型

//順序棧#define MAXSIZE 50typedef struct { SElemType *base; SElemType *top;  //棧頂指針 int stacksize;}SqStack;

3、棧操作函數聲明

typedef int Status;#define OK 1;#define ERROR 0;//棧的相關操作//初始化棧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、迷宮操作函數聲明

//初始化迷宮(同時生成起始點和終點)void initMaze(Maze &maze);//打印迷宮void showMaze(Maze maze);//尋找出路;傳入一個迷宮和棧找出出路void findWay(Maze &maze,SqStack &s);//判斷該點的四個方向是否有通路,有就前進Pos isExit(Pos p, Maze maze);

二、.cpp文件

1、導入所需頭文件

#include "pch.h"#include <iostream>#include<time.h>#include<stdlib.h>using namespace std;

2、棧操作實現

//構造空棧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) { //若為空則返回一個(-1,-1)的點,判斷由外部調用時進行 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) { //終點輸出為“End”  cout << "End"; } } cout << endl; return 0;}

3、迷宮操作實現

///////////////////////////////////////迷宮操作//////////////////////////////////初始化函數,傳入一個迷宮,隨機生成起點和終點,由于起點有一定限制,所以這里起點也固定為幾個最合適的點void initMaze(Maze &maze) { //生成隨機數 srand((unsigned)time(NULL)); int index = rand() % 36 + 1; int start = index % 6 + 1; //生成起始點數值為‘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; } //隨機生成終點'e'表示 while (index = rand()%36+1) { //出口在頂部 if (index >1 &&index<10 && maze.square[1][index-1]!='s') {  maze.square[0][index-1] = 'e';  break; } //出口在右側 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;  } } //左側出口 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) {//首先遍歷找出起始點和終點并保存下來 Pos start,end; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) {  if (maze.square[i][j] == 's')  { //起點壓入棧內  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; //直到找到出口才結束 while ( s.top->x != end.x || s.top->y != end.y) { //獲得下一步坐標 Pos path = isExit(go, maze); if (path.x != go.x || path.y != go.y) {  //前進  maze.square[path.x][path.y] = 'p';  push(s, path);  go = path; } //如果所有放向都走不通(即返回的點是傳入的點),則將其標為“@”,出棧到上一個點,繼續判斷 else {  //走不通pop  maze.square[path.x][path.y] = '@';  pop(s);  go = *s.top; } } maze.square[end.x][end.y] = 'e';}//判斷返回下一步路徑(順序:右下左上),傳入所處位置,從右邊開始判斷是否又通路或者出口,有就返回哪個方向上的點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函數調用

int main(){ while (true) { //創建一個迷宮 Maze maze; initMaze(maze); //初始化一個棧 SqStack S; initStack(S); cout << "*****************************" << endl; cout << "* 1、生成迷宮  2、退出 *" << endl; cout << "*****************************" << endl; cout << "請輸入你的選擇:"; int select = 0; cin >> select; if (select == 1) {  cout << "生成隨機起點和出口迷宮:" << endl;  showMaze(maze);  cout << "生成迷宮路徑:" << endl;  findWay(maze, S);  stackTravel(S);  showMaze(maze);  cout << endl; } if (select == 2) {  clearStack(S);  break; } } return 0;}

四、評價

這是個叫簡易的迷宮,但基本實現了迷宮的尋路邏輯,可改進的地方有:

1、因為很多地方寫死了,所以復用性不高,可以用循環遍歷來隨機生成起點,同理迷宮的生成也是這樣
2、判斷路徑可以用遞歸調用實現前進邏輯

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区网站| 中文字幕亚洲欧美日韩2019| 国产一区二区三区网站| 久久久久成人精品| 日韩高清有码在线| 国产在线观看91精品一区| 亚洲少妇激情视频| 亚洲高清免费观看高清完整版| 日本中文字幕不卡免费| 欧美视频在线视频| 亚洲国产中文字幕久久网| 国产在线观看一区二区三区| 欧美日韩国产丝袜另类| 日韩av一区在线观看| 日韩在线观看免费高清完整版| 国产97在线|日韩| 亚洲欧美制服丝袜| 成人黄色免费在线观看| 91性高湖久久久久久久久_久久99| 亚洲精品国偷自产在线99热| 国内成人精品一区| 国产日韩欧美视频| 亚洲已满18点击进入在线看片| 91精品久久久久久久久久| 亚洲成人黄色网| 欧美色另类天堂2015| 97色在线观看免费视频| 成人免费大片黄在线播放| 亚洲欧美另类人妖| 国产欧美日韩中文字幕| 久久久久亚洲精品成人网小说| 欧美老女人性视频| 欧美日韩国产成人在线观看| 欧美成人免费va影院高清| 亚洲毛片在线观看| 91国自产精品中文字幕亚洲| 国产精品99蜜臀久久不卡二区| 久久久亚洲福利精品午夜| 国产免费一区二区三区香蕉精| 97精品国产97久久久久久免费| 在线成人免费网站| 久久久久久久久91| 亚洲影院色在线观看免费| 久久久久久久久91| 国产精品久久视频| 97人人模人人爽人人喊中文字| 中文欧美在线视频| 国产精品一区二区三区免费视频| 国产精品九九九| 亚洲女人天堂网| 日韩亚洲欧美成人| 97视频在线观看成人| 欧美成人激情视频免费观看| 三级精品视频久久久久| 欧美大人香蕉在线| 亚洲999一在线观看www| 欧美午夜片欧美片在线观看| 亚洲激情视频在线播放| 麻豆国产va免费精品高清在线| 国语自产精品视频在线看抢先版图片| 久久视频在线视频| 国产一区二区成人| 不卡在线观看电视剧完整版| 最近2019免费中文字幕视频三| 免费av在线一区| 日韩电影免费观看中文字幕| 精品国产乱码久久久久久虫虫漫画| 国产精品一香蕉国产线看观看| 51久久精品夜色国产麻豆| 91久久精品一区| 欧美黑人巨大xxx极品| 日韩欧美黄色动漫| 欧美亚洲另类激情另类| 人妖精品videosex性欧美| 亚洲最大福利视频| 91av视频在线播放| 欧美国产亚洲视频| 91久久久久久| 亚洲女人被黑人巨大进入| 日韩av资源在线播放| 上原亚衣av一区二区三区| 不卡av日日日| 尤物yw午夜国产精品视频明星| 欧美肥臀大乳一区二区免费视频| 日韩国产精品一区| 国产亚洲人成网站在线观看| 欧美日韩激情美女| 国产精品网红福利| 91精品久久久久久久久久久| 日韩高清av在线| 欧美一区第一页| 亚洲黄色有码视频| 欧美成人午夜免费视在线看片| 欧美激情按摩在线| 日韩欧美精品中文字幕| 91色在线视频| 国产午夜精品久久久| 成年无码av片在线| 91在线视频成人| 国产精品久久久久aaaa九色| 欧美疯狂xxxx大交乱88av| 日韩电影中文字幕在线观看| 成人黄色在线观看| 国产精品视频久| 国产va免费精品高清在线| 国产精品啪视频| 欧美丝袜第一区| 亚洲一区二区久久久久久久| 亚洲欧洲日产国码av系列天堂| 日韩hd视频在线观看| 日韩理论片久久| 日韩av在线一区| 欧美老妇交乱视频| 久久精品99久久久香蕉| 日韩欧美成人精品| 日韩美女写真福利在线观看| 亚洲xxxx18| 国产精品美女免费看| 北条麻妃一区二区在线观看| 成人欧美一区二区三区在线湿哒哒| 欧美一区二区三区免费观看| 亚洲精品丝袜日韩| 在线播放精品一区二区三区| 欧美精品激情blacked18| 中文字幕av一区二区| 91精品久久久久久久久中文字幕| 欧美成人网在线| 亚洲精品理论电影| 亚洲欧美日韩国产精品| 日韩亚洲欧美中文高清在线| 欧美老肥婆性猛交视频| 欧美激情亚洲国产| 亚洲成人网在线观看| 成人性生交大片免费看小说| 91精品视频在线免费观看| 亚洲男人天堂网| 日韩av在线导航| 深夜福利亚洲导航| 96sao精品视频在线观看| 日本最新高清不卡中文字幕| 欧美国产亚洲精品久久久8v| 亚洲日本中文字幕免费在线不卡| 亚洲福利影片在线| 97超碰蝌蚪网人人做人人爽| 欧美大片va欧美在线播放| 欧美在线免费观看| 亚洲视频一区二区三区| 亚洲影视中文字幕| 91国内精品久久| 91精品91久久久久久| 国产精品网址在线| 俺去亚洲欧洲欧美日韩| 久久久久久久久国产| 亚洲成在人线av| 日韩在线视频中文字幕| 亚洲天堂免费观看| 51午夜精品视频| 狠狠躁夜夜躁久久躁别揉| 欧美一区二区三区图| 亚洲aa在线观看| 亚洲天堂久久av| 国产精品一区专区欧美日韩| 亚洲精选在线观看| 亚洲第一中文字幕|