一、 實驗目的:
(1) 熟練掌握鏈棧的基本操作及應用。
(2) 利用鍊錶作為棧的儲存結構,設計實現乙個求解迷宮的非遞迴程式。
二、實驗內容:
【問題描述】
以乙個mn的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對信任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。
【基本要求】
首先實現乙個鍊錶作儲存結構的棧型別,然後編寫乙個求解迷宮的非遞迴程式。求得的通路以三元組(i,j,d)的形式輸出,其中:(i,j)指示迷宮中的乙個座標,d表示走到下一座標的方向。如:對於下列資料的迷宮,輸出的一條通路為:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。
【測試資料】/strong>
迷宮的測試資料如下:左上角(1,1)為入口,右下角(8,9)為出口。
1 2 3 4 5 6 7 8
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 1
0 1 1 1 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 1
0 1 1 1 1 0 0 1
1 1 0 0 0 1 0 1
1 1 0 0 0 0 0 0
【實現提示】
計算機解迷宮通常用的是「窮舉求解」方法,即從入口出發,順著某乙個方向進行探索,若能走通,則繼續往前進;否則沿著原路退回,換乙個方向繼續探索,直至出口位置,求得一條通路。假如所有可能的通路都程式設計客棧探索到則未能到達出口,則所設定的迷宮沒有通睡。
可以二維陣列ngzyfktbc儲存迷宮資料,通常設定入口點的下標為(1,1),出口點的下標為(n,n)。為處理方便起見,可以迷宮的四周加一圈障礙。對於迷宮任一位置,均可約定有東、南、西、北四個方向可通。
【選作內容】
(1) 編寫遞迴形式的演算法,求得迷宮中所有可能的通路;
(2) 以方陣形式輸出迷宮及其通路。
網友提供了一段解決演算法:
#include
#include
#define m 4//行
#define n 4//列
struct xy
;typedef struct stack
stack;
void init(stack* p)
void push(stack* p,struct xy cdnt)
void pop(stack* p)
void browse(stack* p)
struct xy getend(struct stack* p)
int getsize(stack* p)
return size;
}int main()
; int col = 0,row = 0;
int i = 0,j = 0;
int temp_col = 0,temp_row = 0,t_col = 0,t_row = 0;
int flag = 0;
struct xy t_pair;
//stack a,b;
stack* ahead = (stack*)malloc(sizeof(struct stack)*1);
stack* bhead = (stack*)malloc(sizeof(struct stack)*1);
init(ahead); init(bhead);
for(;i::iterator iter = b.e程式設計客棧nd() - 1;
col = getend(bhead).x + 1;row = getend(bhead).y;//回到上一次分叉處,搜尋右側路徑
pop(ahead);
pop(bhead);
continue;
}else
return 1;
}//下面是,右邊不是
if(path[row + 1][col] == 1 && path[row][col + 1] == 0)
//下面不是,右邊是
if(path[row + 1][col] == 0 && path[row][col + 1] == 1)
}} if(!flag)
printf("there is no way\n");
return 0;
}本文標題: c++迷宮問題的求解演算法
本文位址: /ruanjian/c/303437.html
A 演算法求解迷宮
cpp view plaincopy include include include using namespace std 方向向量 int direc 4 2 封閉,開放列表標記 enum flag 最小堆節點類 堆優先順序為 f g h g為當前的路徑長 h為估計當前位置到目標位置開銷探測 當...
求解迷宮問題
求解迷宮問題 include using namespace std const int m 6 const int n 8 int maze m 2 n 2 m n大小的迷宮,0可前進,1通行受阻。並且在迷宮的周圍鑲上邊框 int mark m 2 n 2 儲存訪問標記,0未訪問,1已訪問 int...
迷宮問題求解
對於迷宮問題的求解,我們最後輸出的是迷宮的路徑,故符合佇列的先進先出特性,所以我們採用佇列的方式對迷宮進行求解 首先我們將建立乙個二維陣列 自定義初始化迷宮 7 7 int arr n n 二維陣列邊界用0填充,使之區域封閉,在實現過程 現陣列越界問題 接下來是 include include de...