[英]How to solve the recursive algorithm stack overflow in a maze program?
我有一個簡單的程序來解決迷宮。 但是報錯:堆棧溢出。 如何解決堆棧溢出?
在我的代碼中, 1
代表牆, 0
代表可以走的路, $
代表終點。 (1,2) 是起點。
這是我的代碼:
#include<stdio.h>
#include<windows.h>
void ShowMaze(char szMaze[][24],int nCount)
{
for(int i=0;i<nCount;i++)
{
printf("%s\r\n",szMaze[i]);
}
}
void Maze(char szMaze[][24],int x,int y)
{
if(szMaze[x][y]=='$')
{
printf("Congratulations!\r\n");
system("pause");
exit(0);
}
if (szMaze[x+1][y]=='$'||szMaze[x+1][y]=='0')
{
Maze(szMaze,x+1,y);
}
if (szMaze[x][y+1]=='$'||szMaze[x][y+1]=='0')
{
Maze(szMaze,x,y+1);
}
if (szMaze[x-1][y]=='$'||szMaze[x-1][y]=='0')
{
Maze(szMaze,x-1,y);
}
if (szMaze[x][y-1]=='$'||szMaze[x][y-1]=='0')
{
Maze(szMaze,x,y-1);
}
return;
}
int main()
{
char szMaze[][24]={
"11111111111111111111111",
"10111111111111111111111",
"10000000001111111111011",
"11111111011111100001011",
"11111111011111101111011",
"11111111000000000001$11",
"11111111011111101111011",
"11111111011111100000001",
"11111111111111111111111"
};
int nRow=sizeof(szMaze)/sizeof(szMaze[0]);
ShowMaze(szMaze,nRow);
Maze(szMaze,1,2);
system("pause");
return 0
為了避免無限循環,您需要標記已經訪問過的位置。
就像是:
szMaze[x][y]='2'; // mark position as visited
if (szMaze[x+1][y]=='$'||szMaze[x+1][y]=='0')
{
Maze(szMaze,x+1,y);
}
if (szMaze[x][y+1]=='$'||szMaze[x][y+1]=='0')
{
Maze(szMaze,x,y+1);
}
if (szMaze[x-1][y]=='$'||szMaze[x-1][y]=='0')
{
Maze(szMaze,x-1,y);
}
if (szMaze[x][y-1]=='$'||szMaze[x][y-1]=='0')
{
Maze(szMaze,x,y-1);
}
szMaze[x][y]='0'; // release position
不要從牆上開始! 像這樣開始:
Maze(szMaze,1,2); ----> Maze(szMaze,1,1);
筆記
您的代碼不進行任何邊界檢查。 因此,只有當迷宮的所有邊界都有牆時,它才會起作用。 有這樣的要求是一種“好的”,但我更喜歡邊界檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.