ধরুন আমাদের একটি 2-মাত্রিক গ্রিড আছে, সেখানে 4 ধরনের বর্গক্ষেত্র রয়েছে -
-
একটি বর্গক্ষেত্রে 1 শুরু বিন্দুর জন্য। ঠিক একটি শুরু বর্গক্ষেত্র হবে৷
৷ -
একটি বর্গক্ষেত্রে 2 শেষ বিন্দুর জন্য। ঠিক একটি শেষ বর্গক্ষেত্র থাকবে৷
৷ -
একটি বর্গক্ষেত্রে 0 খালি বর্গক্ষেত্রের জন্য এবং আমরা তার উপর দিয়ে হেঁটে যেতে পারি।
-
একটি বর্গক্ষেত্রে -1 যদি বাধাগুলির জন্য যা আমরা অতিক্রম করতে পারি না।
আমাদের প্রারম্ভিক স্কোয়ার থেকে শেষ বর্গ পর্যন্ত 4-দিকনির্দেশক হাঁটার সংখ্যা খুঁজে বের করতে হবে, যা প্রতিটি অ-বাধাবিহীন বর্গক্ষেত্রের উপর দিয়ে ঠিক একবার হাঁটে।
সুতরাং, যদি ইনপুট −
এর মত হয়1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
1 | 0 | 2 | -1 |
তাহলে আউটপুট হবে 2, যেমন আমাদের এই দুটি পথ রয়েছে:(0,0), (0,1), (0,2), (0,3), (1,3), (1,2), (1,1), (1,0), (2,0), (2,1), (2,2) এবং (0,0), (1,0), (2,0), (2) ,1), (1,1), (0,1), (0,2), (0,3), (1,3), (1,2), (2,2)।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন dfs(), এটি একটি 2D অ্যারে গ্রিড নেবে, i, j, ex, ey, empty,
-
যদি i,j গ্রিড বা গ্রিডের পরিসরে না থাকে [i, j] -1 এর মতো, তাহলে −
-
রিটার্ন 0
-
-
যদি গ্রিড[i, j] 2 এর মত হয়, তাহলে
-
খালি হলে true রিটার্ন করুন -1
-
-
x :=0
-
(1 দ্বারা খালি কমান)
-
গ্রিড[i, j] :=-1
-
আরম্ভ করার জন্য k :=0, যখন k <4, আপডেট করুন (k 1 দ্বারা বৃদ্ধি করুন), করুন −
-
nx :=i + dir[k, 0]
-
ny :=j + dir[k, 1]
-
x :=x + dfs(গ্রিড, nx, ny, ex, ey, খালি)
-
-
(1 দ্বারা খালি বাড়ান)
-
গ্রিড[i, j] :=0
-
রিটার্ন x
-
পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
খালি :=0
-
n :=সারি গণনা, m :=কলাম গণনা
-
আরম্ভ করার জন্য i :=0, যখন i
-
j শুরু করার জন্য :=0, যখন j
করুন -
যদি গ্রিড[i, j] 0 এর মত হয়, তাহলে
-
(1 দ্বারা খালি বাড়ান)
-
-
অন্যথায় যখন গ্রিড[i, j] 1 এর মত হয়, তখন −
-
sx :=i, sy :=j
-
-
অন্যথায় যখন গ্রিড[i, j] 2 এর মত হয়, তাহলে −
-
ex :=i, ey :=j
-
-
-
-
রিটার্ন ডিএফএস (গ্রিড, এসএক্স, সি, এক্স, ই, খালি)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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 >= grid.size() || i < 0 || j >= grid[0].size() || j < 0 || 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 nx = i + dir[k][0]; int ny = j + dir[k][1]; x += dfs(grid, nx, ny, ex, ey, empty); } empty++; grid[i][j] = 0; return x; } int uniquePathsIII(vector<vector<int> >& grid){ int empty = 0; int sx, sy, ex, ey; int n = grid.size(); int m = grid[0].size(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (grid[i][j] == 0) empty++; else if (grid[i][j] == 1) { sx = i; sy = j; } else if (grid[i][j] == 2) { ex = i; ey = j; } } } return dfs(grid, sx, sy, ex, ey, empty); } }; main(){ Solution ob; vector<vector<int>> v = {{1,0,0,0},{0,0,0,0},{0,0,2,-1}}; cout << (ob.uniquePathsIII(v)); }
ইনপুট
{{1,0,0,0},{0,0,0,0},{0,0,2,-1}}
আউটপুট
2