问题一: 给定一个rows*cols 大小的0,1矩阵,给出起点和终点坐标,0可以走,1不可以走,每次只能向上下左右,走一步,求出从起点到终点的最短路径;
解题思路:回溯法解决的经典问题,由于回溯的递归特性,首先要找到递归结束的条件,本题终点就是结束条件(在递归结束判断此路径是否为最优路径)
其次,找出递归的条件,本题是坐标x,y的值在合理范围内,并且此点没有走过
回溯的位置与条件,当第n个位置四周都为1,都不可以走,则需要回到第n-1位置,只需将第n的位置弹出,设置为没有走过。
//*matrix表示二维0,1矩阵; rows表示矩阵的行数,cols表示矩阵的列数,
//*p1表示起点坐标,p2表示终点坐标,bool *visited用来标记矩阵中的点是否走过没有为0,走过为1;
//*vector<Point>& totalPath 用来盛放最新求出的路径,vector<Point>& bestPath用来盛放最短的路径,这两个参数都加了引用,表示指向实参的位置,而不是重新开辟新的变量,因为在递归调用时,这两个参数会随之改变。
void findBestPath(int *matrix,int rows,int cols,Point p1,Point p2,bool *visited,vector<Point>& totalPath,vector<Point>& bestPath)
{
int x = p1.x, y = p1.y;
if(visited[x*cols + y] == false && matrix[x*cols + y] == 0)
{
totalPath.push_back(p1);
visited[x*cols + y] = true;
if(x == p2.x && y == p2.y)//这个结束判断语句什么时候写
{
//如果是找到的第一条路径,直接添加到bestpath中
int i = 0;
if(bestPath.size() == 0)
{
while(i < totalPath.size())
{
bestPath.push_back(totalPath[i]);
i++;
}
}
else
{
//选择一个最短的路径放到bestPath中
if(bestPath.size() > totalPath.size())
{