所謂迷宮,就是在乙個矩陣中,從開始位置有一條通路可以走到最末尾的位置
先畫乙個迷宮,格式為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...