矩阵行走路径问题

来源:互联网 发布:ea7视频软件 编辑:程序博客网 时间:2024/04/20 19:14

1、一个m*n的矩阵a[][],机器人从左上角走到右下角,只能朝右或朝下走,输出所有路径。

2、如果矩阵有的格子可以走,有的格子不可以走,输出所有路径。(a[i][j]==1表示可以走,a[i][j]==0表示不可以走)

思路:

    利用递归算法求解问题。问题1直接用深搜的思想。问题2在问题1的基础上加个判断条件即可。

    关于这类题目中求解从某一点到某一点的所有可能路径的数目可参考这里

  1. #include <iostream>  
  2. #include <vector>  
  3. using namespace std;  
  4.   
  5. struct Point  
  6. {  
  7.     int x;  
  8.     int y;  
  9.     Point(int i, int j) : x(i), y(j)  
  10.     {}  
  11. };  
  12.   
  13. //问题1  x y是起始点,m n是终止点 向量中坐标记录路径
  14. void Path1(int x, int y, int m, int n, vector<Point>& vec, int len)  
  15. {  
  16.     if (x == m || y == n)  
  17.         return;  
  18.     Point p(x, y);  
  19.     vec[len++] = p;  
  20.     if (x == m - 1 && y == n - 1)  
  21.     {  
  22.         for (int i = 0; i < vec.size(); ++i)  
  23.             cout << vec[i].x << ' ' << vec[i].y << endl;  
  24.     }  
  25.     else  
  26.     {  
  27.         Path1(x, y+1, m, n, vec, len);  
  28.         Path1(x+1, y, m, n, vec, len);  
  29.     }  
  30. }  
  31.   
  32. //问题2  
  33. void Path2(int x, int y, int m, int n, vector<Point>& vec, int len, int safe[][4])  
  34. {  
  35.     if (x == m || y == n || safe[x][y] == 0)  
  36.         return;  
  37.     Point p(x, y);  
  38.     vec[len++] = p;  
  39.     if (x == m - 1 && y == n - 1)  
  40.     {  
  41.         for (int i = 0; i < vec.size(); ++i)  
  42.             cout << vec[i].x << ' ' << vec[i].y << endl;  
  43.     }  
  44.     else  
  45.     {  
  46.         Path2(x, y+1, m, n, vec, len, safe);  
  47.         Path2(x+1, y, m, n, vec, len, safe);  
  48.     }  
  49. }  
  50. void main()  
  51. {  
  52.     int m = 3, n = 4;  
  53.     int x = 0, y = 0;  
  54.     int len = 0;  
  55.     Point p(0, 0);  
  56.     vector<Point> vec(m+n-1, p);  
  57.     Path1(x, y, m, n, vec, len);  
  58.   
  59.     int safe[][4] = { {1, 1, 1, 0},{0, 1, 1, 1}, {0, 0, 1, 1} };  
  60.     Path2(x, y, m, n, vec, len, safe);  
  61. }

  其实这是一个回溯问题,这里我再贴一段代码,有稍微的区别,就可以更加容易辨别这是回溯问题了。

void Path1(int x, int y, int m, int n, vector<Point>& vec, int len)  {      if (x == m || y == n)          return;      Point p(x, y);    //  vec[len++] = p;    vec.push_back(p);    if (x == m - 1 && y == n - 1)      {          for (int i = 0; i < vec.size(); ++i)              cout << vec[i].x << ' ' << vec[i].y << endl;      }        Path1(x, y+1, m, n, vec, len);      Path1(x+1, y, m, n, vec, len);  vec.pop_back();      } 


原创粉丝点击