C 迷宮問題的求解演算法

2022-09-29 06:15:08 字數 2234 閱讀 4497

一、 實驗目的:

(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...