資料結構 之迷宮問題

2021-07-28 06:07:51 字數 4084 閱讀 9785

所謂迷宮,就是在乙個矩陣中,從開始位置有一條通路可以走到最末尾的位置

先畫乙個迷宮,格式為txt,和編譯的資料夾放在一起

在迷宮中,0表示可以走通的路,而1則表示不可走通的牆

首先定義乙個結構體,用來存放行和列

struct pos

;

接下來從檔案中獲得迷宮 的矩陣

void getmaze(int *maze, size_t n)

for (size_t i = 0; i < n; ++i)

else if (ch == eof)}}}

然後就要判斷迷宮中的每乙個座標的路是否為通路

bool checkisaccess(int* maze, size_t n, pos next)

return false;

}

接下倆對於路徑的求解的演算法有兩種方法,遞迴和非遞迴

非遞迴求解:

bool getmazepath(int *maze, size_t n, pos entry, stack&path)

next = cur;

next.row += 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

next.row -= 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

next.col += 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

next.col -= 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

path.pop();

} return false;

}

用遞迴的方法:

void getmazepath_r(int *maze, size_t n,pos entry, stack&path,stack&shortpath)

path.pop();

return;

} pos cur, next;

cur = entry;

next = cur;

next.row += 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

next = cur;

next.row -= 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

next.col += 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

next.col -= 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

path.pop();

}

其中的-=1和+=1是表示在乙個位置處有四個方向,通過行和列的+1和-1來表示這四個方向。

下面就是完整的**:

#define _crt_secure_no_warnings 1

#includeusing namespace std;

#includeconst int n = 10;

struct pos

;void printmaze(int *maze, size_t n)

cout << endl;

} cout << endl;

}bool checkisaccess(int *maze, size_t n, pos next)

return false;

}bool checkisaccess(int *maze, size_t n, pos next, pos cur)

if (maze[next.row*n + next.col] == 0)

return(maze[next.row*n + next.col]>(maze[cur.row*n + next.col] + 1));

}void getmaze(int *maze, size_t n)

for (size_t i = 0; i < n; ++i)

else if (ch == eof)

} }}

bool getmazepath(int *maze, size_t n, pos entry, stack&path)

next = cur;

next.row += 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

next.row -= 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

next.col += 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

next.col -= 1;

if (checkisaccess((int*)maze, n, next) == true)

next = cur;

path.pop();

} return false;

}void getmazepath_r(int *maze, size_t n,pos entry, stack&path,stack&shortpath)

path.pop();

return;

} pos cur, next;

cur = entry;

next = cur;

next.row += 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

next = cur;

next.row -= 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

next.col += 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

next.col -= 1;

if (checkisaccess((int*)maze, n, next, cur) == true)

path.pop();

}void remaze(int* maze)

} }}stackminpath()

; int curmaze[n][n] = ;

getmaze((int*)maze, n);

stackpath, minpath, empty;

while (getmazepath((int*)maze, n, , path))

remaze((int*)maze);

maze[path.top().row][path.top().col] = 1;

path = empty;

} return minpath;

}void test()

; int curmaze[n][n] = ;

getmaze((int*)maze, n);

stackpath, shortpath;

path.push();

getmazepath_r((int*)maze, n, , path, shortpath);

cout << shortpath.size() << endl;

} catch (exception &e) }

int main()



資料結構之迷宮問題

求迷宮問題就是求出從入口到出口的路徑。在求解時,通常用的是 窮舉求解 的方法,即從入口出發,順某一方向向前試探,若能走通,則繼續往前走 否則沿原路退回,換乙個方向再繼續 試探,直至所有可能的通路都試探完為止。為了保證在任何位置上都能沿原路退回 稱為回溯 需要用乙個後進先出的棧來儲存從入口到當前位置的...

資料結構之迷宮問題

迷宮結構如下 定義三個結構體,define size 100 對該迷宮,100個夠用了 define add size 10 每次要增加的大小 define endflag null 出錯時返回的標誌 define row 8 迷宮的行的大小,對應i define col 8 迷宮的列的大小,對應j...

資料結構 迷宮問題

迷宮問題的總體思路是,從迷宮的入口出發,沿著某乙個方向向前試探,若能夠行得通,則繼續往前走,否則原來返回,再換另乙個方向繼續試探,直到所有可能的通路都被試探過,為了保證在任何乙個位置都能夠原來返回,需要設定乙個堆疊結構來儲存從入口到當前位置的路徑。maze.h pragma once include...