求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离;
图中有数字的点表示为图中的不同海拔的高地,不能通过;没有数字的点表示海拔为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;
}