review01

 

  

#include <iostream>
#include <vector>
using namespace std;

static int x[] = { -1, 0, 1, 0};
static int y[] = { 0, -1, 0, 1};

class Solution{
public:
    void shortPath(vector<vector<int>>& grap, vector<vector<int>>& used, int target_row, int target_col, bool flag, int i, int j, int steps, vector<int>& ret) {
        if (i == target_row && j == target_col) {
            ret.push_back(steps);
            cout << "arrive:" << steps << endl;
            return;
        }

        // used[i][j] = 1;
        for (uint8_t k = 0; k < 4; k++) {
            int newx = i + x[k];
            int newy = j + y[k];
            if (newx >= 0 && newx < (int)grap.size() && newy >= 0 && newy < (int)grap[0].size() && used[newx][newy] == 0) {
                used[newx][newy] = 1;
                if (grap[newx][newy] == 0) {
                    shortPath(grap, used, target_row, target_col, flag, newx, newy, steps + 1, ret);
                } else if (flag) {
                    flag = false;
                    shortPath(grap, used, target_row, target_col, flag, newx, newy, steps + 1, ret);
                }

                used[i][j] = 0;
            }
        }
    }
};

int main()
{
    Solution s;
    vector<vector<int>>grap = { {0, 0, 1, 0}, {0, 0, 0, 0} };
    vector<vector<int>>used(grap.size(), vector<int>(0, grap[0].size()));  
    vector<int>ret;
    s.shortPath(grap, used, 0, 3, true, 0, 0, 0, ret);

    return 0;
}

 

两个地方,弄了半天。-_-||

used[i][j] = 0;  // 这里必须回溯,不然只会遍历一次路径

00
10
11
01
02
12
13
03
arrive:7

正确输出:

00
10
11
01
02
12
13
03
arrive:7
03
arrive:5
12
02
01
03
arrive:5
13
03
arrive:5
01
11
10
12
02
03
arrive:5
13
03
arrive:5
02
12
11
10
13
03
arrive:5
03
arrive:3

 

posted @ 2020-03-24 22:22  ren_zhg1992  阅读(121)  评论(0)    收藏  举报