#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就可以過了 大致思路 列舉每乙個點 計算其他所有點...