• LC 980. Unique Paths III


    On a 2-dimensional grid, there are 4 types of squares:

    • 1 represents the starting square.  There is exactly one starting square.
    • 2 represents the ending square.  There is exactly one ending square.
    • 0 represents empty squares we can walk over.
    • -1 represents obstacles that we cannot walk over.

    Return the number of 4-directional walks from the starting square to the ending square, that walk over every non-obstacle square exactly once.

    Example 1:

    Input: [[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
    Output: 2
    Explanation: We have the following two paths: 
    1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
    2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)

    Example 2:

    Input: [[1,0,0,0],[0,0,0,0],[0,0,0,2]]
    Output: 4
    Explanation: We have the following four paths: 
    1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3)
    2. (0,0),(0,1),(1,1),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,3),(1,3),(2,3)
    3. (0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(1,1),(0,1),(0,2),(0,3),(1,3),(2,3)
    4. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2),(2,3)

    Example 3:

    Input: [[0,1],[2,0]]
    Output: 0
    Explanation: 
    There is no path that walks over every empty square exactly once.
    Note that the starting and ending square can be anywhere in the grid.
    

    Note:

    1. 1 <= grid.length * grid[0].length <= 20

    Runtime: 0 ms, faster than 100.00% of C++ online submissions for Unique Paths III.

    //
    // Created by yuxi on 2019/1/21.
    //
    
    #include <vector>
    #include <iostream>
    using namespace std;
    
    class Solution {
    public:
      int cntzero;
      int ret;
      vector<vector<int>> dirs = {{0,1},{0,-1},{-1,0},{1,0}};
      int uniquePathsIII(vector<vector<int>>& grid) {
        vector<vector<int>> records(2, vector<int>(2,0));
        ret = 0;
        cntzero = 0;
        for(int i=0; i<grid.size(); i++) {
          for(int j=0; j < grid[0].size(); j++) {
            if(grid[i][j] == 1) {
              records[0][0] = i;
              records[0][1] = j;
            } else if(grid[i][j] == 2){
              records[1][0] = i;
              records[1][1] = j;
            } else if(grid[i][j] == 0) cntzero++;
          }
        }
        int cnt = 0;
        vector<bool> used(grid.size()*grid[0].size(), false);
        vector<vector<int>> path;
        helper(grid, path, records[0], records[1], cnt, used);
        //cout << ret << endl;
        return ret;
      }
      void helper(vector<vector<int>>& grid, vector<vector<int>>& path, vector<int> s, vector<int>& e, int cnt, vector<bool>& used) {
    //    for(int i=0; i<path.size(); i++) {
    //      cout << "("<< path[i][0] << " " << path[i][1] << ")" << " ";
    //    }
        //printgird(grid);
        int N = grid.size(), M = grid[0].size();
        if(s[0] == e[0] && s[1] == e[1]) {
    //      cout << "(" << s[0] << " " << s[1] << ")" << " " << endl;
          if(cnt == cntzero) ret++;
          return;
        }
        // cout << endl;
    //    used[s[0]*N+s[1]] = true;
        grid[s[0]][s[1]] = -2;
        path.push_back({s[0],s[1]});
        for(auto& dir : dirs) {
          int newx = dir[0] + s[0], newy = dir[1] + s[1];
          if(newx >= 0 && newx < N && newy >= 0 && newy < M && grid[newx][newy] != -2 && grid[newx][newy] != 1 && grid[newx][newy] != -1) {
            int newcnt = cnt;
            if(grid[newx][newy] == 0) newcnt++;
            helper(grid, path, {newx, newy}, e, newcnt, used);
          }
        }
        grid[s[0]][s[1]] = 0;
    //    used[s[0]*N+s[1]] = false;
        path.pop_back();
      }
    
    
      void printgird(vector<vector<int>>& grid) {
        int N = grid.size(), M = grid[0].size();
        for(int i=0; i<N; i++) {
          for(int j=0; j<M; j++) {
            cout << grid[i][j] << " ";
          }
          cout << endl;
        }
      }
    };
  • 相关阅读:
    UML序列图
    接口初探
    Discuz初探
    Vim指令学习
    UCenter Home代码研读之space.php
    建站须知
    linux指令之文件的创建、查询、修改
    InitPHP初探
    php环境搭建
    Zend Framework学习之Zend_Db 数据库操作
  • 原文地址:https://www.cnblogs.com/ethanhong/p/10306766.html
Copyright © 2020-2023  润新知