深度優先 求迷宮中包含最多珠寶的路徑

2021-06-22 14:31:52 字數 2331 閱讀 7411

#include

實現1:用棧

int n;

int maze[11][11];

int jewels_count;

//迷宮maze中入口(0,0),出口(n-1, n-1),迷宮是二維n*n的陣列表示,0表示通路,1表示障礙物,2表示珠寶jewel

//求迷宮中包含最多珠寶的路徑(該路徑上的珠寶數目以及路徑(每點用3表示,並把整個迷宮輸出)) 

#define maxsize 1000

struct migong

stack[maxsize],path[maxsize];      //定義棧和存放最短路徑的陣列

int top= -1;     //棧頂指標,初始值為-1

int cur_jewels = 0;

int cur_len = 0;

//出口

int exitx;

int exity;

void mgpath() //路徑為:(0,0)->...->(exitx,exity)

maze[0][0] = -1;     //-1表示該節點位置進棧過(最好用其他陣列來標示),用1貌似也可以

while(top > -1) //棧不空時迴圈

printf("cur_jewels=%d\n", cur_jewels);

#endif

if(jewels_count < cur_jewels)

jewels_count = cur_jewels; //更新最大的jewels數

cur_len = top + 1;  //儲存當前的深度

}//cur_jewels = 0; //reset

maze[stack[top].i][stack[top].j] = stack[top].value;  //讓該位置恢復原值,變為其他路徑的可走結點

//讓元素出棧

top--;

i=stack[top].i;

j=stack[top].j;

di=stack[top].di;  //記錄下一次的查詢方向為新棧頂的的查詢方向

}//3 -------在當前棧頂的基礎上找到下乙個可走節點,如果當前棧頂的4個方向都走完了,則退棧找新的棧頂

nextfound=0;

while(di < 4 && nextfound==0) //找下乙個可走結點

if(i >= 0 && i <= exitx && j >= 0 && j <= exity)  //有效範圍}}

if(nextfound == 1) //從當前棧頂上找到了下乙個可走結點

maze[i][j] = -1;

}else  //如果當前棧頂的4個方向都已經查詢完

maze[stack[top].i][stack[top].j] = stack[top].value;   //讓該位置恢復原值,變為其他路徑的可走結點

top--;  //當前棧頂已經查詢完,讓它出棧}}

//標記能得到最多jewels的路徑

for(k=0;k

}int main(void)

}jewels_count = 0;

exitx = n-1;

exity = n-1;

mgpath();

// print the answer to standard output(screen).

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

printf("\n");

}printf("%d\n\n", jewels_count);

}return 0;

實現2,用遞迴

#include

int n;

int maze[11][11];

int maze2[11][11];

int jewels_count;

int offset[4][2] = ;

void dfs_jewels( int x, int y, int count)

maze[x][y]=3;

if(x==n-1&&y==n-1)}}

}for ( k= 0; k< 4; k++ )}}

maze[x][y] = old;

}int main(void)

}jewels_count = 0;

dfs_jewels(0,0,0);

// print the answer to standard output(screen).

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

printf("\n");

}printf("%d\n\n", jewels_count);

}return 0;

}

深度優先搜尋找迷宮的出路

現在我們用堆疊解決乙個有意思的問題,定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的路線。程式如下 例 12.3.用深度優先搜尋解迷宮問題 include define max row...

生成迷宮的深度優先遍歷演算法的非遞迴實現

生成一張二維單路徑迷宮圖,可以想到的方法之一就是圖的遍歷。因為單路徑顧名思義就是要求每個節點能切只能訪問一次,這正好和圖的遍歷方法一樣。其次就是圖的遍歷保證了只有一條路徑。執行後即如下圖所示 首先建立乙個二維陣列,char maze h w 其中h和w必須是奇數,建立乙個空間足夠大的棧stack h...

求一條直線上能包含的最多數量的點

題目大意 給n個二維點的座標,求在所有點的連線中一條直線所能包含最多的點的個數 2000ms,1000的複雜度剛開始自己想了個n 3複雜度的方法,即使加上了感覺很有效的剪枝,但是依然tle了。看了網上某acmer的部落格,恍然大悟,原來n 2logn就可以過了 大致思路 列舉每乙個點 計算其他所有點...