ধরুন আমাদের একটি 2d বাইনারি ম্যাট্রিক্স আছে যেখানে 0 খালি ঘর এবং 1 একটি প্রাচীর প্রতিনিধিত্ব করে। আমাদের ন্যূনতম সংখ্যার কোষগুলি খুঁজে বের করতে হবে যেগুলি প্রাচীর হয়ে উঠতে হবে যাতে উপরের-বাম ঘর এবং নীচে-ডান ঘরের মধ্যে কোনও পথ না থাকে। আমরা উপরের-বাম কক্ষে এবং নীচের-ডান কক্ষে দেয়াল লাগাতে পারি না। আমরা কেবল বাম, ডান, উপরে এবং নীচে সরাতে পারি তির্যকভাবে নয়।
সুতরাং, যদি ইনপুট মত হয়
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 |
0 | 0 | 0 | 0 |
তাহলে আউটপুট হবে 2,
0 | 1 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 |
0 | 0 | 1 | 0 |
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
R :=ম্যাট্রিক্সের সারি গণনা, C :=ম্যাট্রিক্সের কলাম গণনা
-
পরিদর্শন করেছেন :=একটি নতুন সেট
-
tin :=একটি নতুন মানচিত্র, নিম্ন :=একটি নতুন মানচিত্র
-
টাইমার :=0
-
bridge_pts :=একটি নতুন সেট
-
par :=একটি নতুন মানচিত্র
-
src :=একটি জোড়া (0, 0)
-
tgt :=একটি জোড়া (R − 1, C − 1)
-
একটি ফাংশন dfs() সংজ্ঞায়িত করুন। এটি v, parent
লাগবে -
ভি ভিজিট হিসাবে চিহ্নিত করুন
-
par[v] :=অভিভাবক, tin[v] :=টাইমার, কম[v] :=টাইমার
-
টাইমার :=টাইমার + 1
-
শিশু :=0
-
v এর প্রতিবেশীদের জন্য, করুন
-
যদি পিতামাতার মতো হয়, তাহলে
-
পরবর্তী পুনরাবৃত্তির জন্য যান
-
-
যদি পরিদর্শন করা হয়, তাহলে
-
low[v] :=সর্বনিম্ন কম[v] এবং টিন[থেকে]
-
-
অন্যথায়,
-
dfs(to, v)
-
low[v] :=সর্বনিম্ন কম[v] এবং কম[থেকে]
-
যদি low[to]>=tin[v] এবং প্যারেন্ট নাল না হয়, তাহলে
-
bridge_pts এ v যোগ করুন
-
-
শিশু :=শিশু + 1
-
-
-
যদি অভিভাবক শূন্য হয় এবং শিশু> 1 হয়, তাহলে
-
bridge_pts এ v যোগ করুন
-
-
একটি ফাংশন bfs() সংজ্ঞায়িত করুন। এটি রুট নেবে
-
প্রশ্ন :=একক উপাদান রুট সহ একটি তালিকা সহ একটি ডবল শেষ সারি
-
পরিদর্শন করেছেন :=একটি নতুন সেট এবং প্রাথমিকভাবে রুট সন্নিবেশ করান
-
যখন Q খালি নয়, করুন
-
v :=Q এর শেষ উপাদান, তারপর Q
থেকে শেষ উপাদান মুছে দিন -
v যদি tgt এর মত হয়, তাহলে
-
রিটার্ন ট্রু
-
-
v এর প্রতিবেশীর প্রতিটি w এর জন্য, do
-
যদি w পরিদর্শন না করা হয়, তাহলে
-
w চিহ্নিত করুন
-
Q
এর বাম দিকে w সন্নিবেশ করুন
-
-
-
-
রিটার্ন ফলস
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
dfs(src, null)
-
যদি tgt সমান না হয়, তাহলে
-
রিটার্ন 0
-
-
প্রতিটি জোড়ার জন্য (i, j) bridge_pts, করুন
-
ম্যাট্রিক্স[i, j] :=1
-
-
যদি bfs(src) সত্য হয়, তাহলে
-
রিটার্ন 2
-
-
রিটার্ন 1
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
from collections import deque class Solution: def solve(self, matrix): R = len(matrix) C = len(matrix[0]) def get_neighbors(i, j): for ii, jj in ((i + 1, j), (i− 1, j), (i, j + 1), (i, j − 1)): if 0 <= ii < R and 0 <= jj < C and matrix[ii][jj] == 0: yield ii, jj visited = set() tin = {} low = {} timer = 0 bridge_pts = set() par = {} src = (0, 0) tgt = (R− 1, C− 1) def dfs(v, parent): nonlocal timer visited.add(v) par[v] = parent tin[v] = timer low[v] = timer timer += 1 children = 0 for to in get_neighbors(*v): if to == parent: continue if to in visited: low[v] = min(low[v], tin[to]) else: dfs(to, v) low[v] = min(low[v], low[to]) if low[to] >= tin[v] and parent is not None: bridge_pts.add(v) children += 1 if parent is None and children > 1: bridge_pts.add(v) def bfs(root): Q = deque([root]) visited = set([root]) while Q: v = Q.pop() if v == tgt: return True for w in get_neighbors(*v): if w not in visited: visited.add(w) Q.appendleft(w) return False dfs(src, None) if tgt not in par: return 0 for i, j in bridge_pts: matrix[i][j] = 1 if bfs(src): return 2 return 1 ob = Solution() matrix = [ [0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], ] print(ob.solve(matrix))
ইনপুট
[ [0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], ]
আউটপুট
2