求從圖中的任意一點(起點)到另一點(終點)的最短路徑,最短距離;
圖中有數字的點表示為圖中的不同海拔的高地,不能通過;沒有數字的點表示海拔為0,為平地可以通過;
這個是典型的求圖中兩點的最短路徑;本例,用深度優先算法來實現;
在每一個點都有四個方向(有的點的有些方向不能通過),所以在每一個點處要處理四種方向的情況;
深度優先算法函數怎么寫?
也就是寫遞歸函數。。。但是遞歸函數腫么寫???
第一:判斷初始態,從起點出發,剛開始步數為0;dfs(start_x, start_y, 0);
第二:從起點出發,要做什么事情?嘗試四個方向的走法。
在每個方向上要什么?先判斷這個點是否到達邊界,再判斷這個點是否走過並且是否是高地;如果不是高地也沒有走過,則再從該點出發,做和之前的點一樣的事情;
dfs(tx, ty, step+1);
第二:判斷終止條件,到達終點,判斷當前步數;返回;
/************************************************************************* > File Name: search_min_step.cpp > Author: > Mail: > Created Time: 2015年11月13日 星期五 21時49分41秒 ************************************************************************/ #include<iostream> using namespace std; const int MAX_X = 50; const int MAX_Y = 50; int min_step = 10000; int my_x, my_y; int map[MAX_X][MAX_Y]; int book[MAX_X][MAX_Y]; int start_x, start_y; int dest_x, dest_y; void dfs(int x, int y, int step) { /*up, right, down, left*/ int next[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; int tx, ty; if (x == dest_x && y == dest_y){ if (step < min_step) min_step = step; return; } for (int i = 0; i < 4; i++){ tx = x + next[i][0]; ty = y + next[i][1]; if (tx > my_x || ty > my_y || tx < 0 || ty < 0) continue; if (map[tx][ty] == 0 && book[tx][ty] == 0){ book[tx][ty] = 1; dfs(tx, ty, step+1); book[tx][ty] = 0; } } } void input_map_info() { cout << "input the max x:"; cin >> my_x; cout << "input the max y:"; cin >> my_y; cout << "input the map information:\n"; for (int i = 1; i <= my_x; i++){ for (int j = 1; j <= my_y; j++){ cin >> map[i][j]; } } } int main() { input_map_info(); cout << "input the source location:"; cin >> start_x >> start_y; cout << "input the destat location:"; cin >> dest_x >> dest_y; book[start_x][start_y] = 1; dfs(start_x, start_y, 0); cout << "min_step = " << min_step << endl; return 0; }