Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Unique Paths III ใน C++


คำอธิบายโจทย์

กริด 2D: 1=start, 2=end, 0=ว่าง, -1=อุปสรรค หาเส้นทาง 4 ทิศทางจาก start ถึง end เดินครบทุกช่องว่างทีละ 1 ครั้ง

ตัวอย่าง

Grid 3×4 → Output: 2

พบ 2 เส้นทางที่ครอบคลุมทุกช่อง 0 ทีละ 1 ครั้ง

วิธีแก้ปัญหา

DFS + Backtracking:

  • นับช่องว่าง (empty) รวม start
  • DFS จาก start mark visited = -1
  • ถึง end: ถ้า empty==-1 (เดินครบทุกช่อง) → count++
  • Backtrack: unmark, empty++

การทำงานของโค้ด

#include <bits/stdc++.h>
using namespace std;

int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};

class Solution {
public:
    int dfs(vector<vector<int>>& grid, int i, int j, int ex, int ey, int empty) {
        if(i<0 || i>=grid.size() || j<0 || j>=grid[0].size() || grid[i][j]==-1) return 0;
        if(grid[i][j]==2) return empty==-1;
        
        int x=0; empty--; grid[i][j]=-1;
        for(int k=0;k<4;k++) {
            int ni=i+dir[k][0], nj=j+dir[k][1];
            x += dfs(grid, ni, nj, ex, ey, empty);
        }
        empty++; grid[i][j]=0;
        return x;
    }
    
    int uniquePathsIII(vector<vector<int>>& grid) {
        int empty=0, sx, sy, ex, ey;
        int n=grid.size(), m=grid[0].size();
        for(int i=0;i

อินพุต

{{1,0,0,0},{0,0,0,0},{0,0,2,-1}}

เอาต์พุต

2