3.7.17 · D5 · HinglishAlgorithm Paradigms

Question bankBacktracking problems — N-Queens, Sudoku solver, all permutations - subsets

2,073 words9 min read↑ Read in English

3.7.17 · D5 · Coding › Algorithm Paradigms › Backtracking problems — N-Queens, Sudoku solver, all permuta

Shuru karne se pehle, teen words jo tumhare paas hone chahiye, kyunki har jawab inhi par tikta hai:


True or false — justify karo

True or false: Backtracking hamesha pure brute force se kam nodes visit karta hai.
False — zero effective pruning ke saath (e.g. ek constraint jo leaf tak kabhi violate nahi hoti) yeh brute force mein degenerate ho jaata hai aur usi poore tree ko visit karta hai. Backtracking tabhi jeeatta hai jab valid check branches ko jaldi khatam karta hai.
True or false: "Un-choose" step optional hai agar tum har recursive call mein state ki fresh copy banao.
True in effect — agar har call ko apna independent state mile toh share karne ke liye kuch nahi hai jo corrupt ho, isliye undo ki zaroorat nahi. Lekin copying time/memory lagti hai, aur mutate-and-restore bilkul yahi avoid karta hai; yahi trade-off hai jiske liye shared-state style exist karta hai.
True or false: Subsets template mein bt(i+1) ko do baar call karna (ek baar append se pehle aur ek baar baad mein) hi "in / out" branching produce karta hai.
True — pehli call un worlds ko explore karti hai jahan nums[i] skip kiya gaya; phir append un worlds ko banata hai jahan yeh liya gaya. Do calls decision tree mein node i ke do children hain.
True or false: N-Queens ko poora search tree explore karna padta hai, isliye pruning se koi faayda nahi.
False — yeh har surviving branch explore karta hai kyunki yeh sab solutions collect karta hai, lekin pruning fir bhi attacked squares ko turant discard karti hai, tree ko per-row brute force se ghatakar zyada se zyada viable columns per row tak laati hai.
True or false: Sudoku solver True stack ke upar return karta hai kyunki Sudoku mein kai solutions ho sakte hain.
False — yeh True ke saath short-circuit karta hai precisely kyunki hum ek solution chahte hain; boolean ek deep success ko baaki sab alternatives rokne deta hai instead of bekar search karte rehne ke.
True or false: Permutations mein, recursive call ke baad used[i] = False reset karna sirf is branch ki correctness ke liye zaroori hai.
False — yeh branch tab tak khatam ho chuki hai; reset element i ko sibling branches ke liye free karta hai (e.g. "2 pehle" ko baad mein element 1 rakhne ki permission honi chahiye).
True or false: Backtracking DFS ka ek special case hai.
True — yeh partial solutions ke tree par DFS hai, ek added valid test ke saath jo children ko prune karta hai aur ek un-choose ke saath jo wapas aate waqt shared state restore karta hai.
True or false: path store karna (na ki path[:]) tab bhi kaam karta hai jab tak tum path ko dobara mutate nahi karte.
True but useless — tum karte ho path ko mutate har sibling aur har deeper call par, isliye practically saare stored references usi ek final (usually empty) list ki taraf point karte hain. "Copy store karo" rule isliye hai kyunki woh mutation unavoidable hai.
True or false: Branch-and-Bound aur backtracking ek hi algorithm hain.
False — Branch-and-Bound ek numeric bound use karke prune karta hai objective par (branch ka best-possible cost) optimization problems ke liye; backtracking ek feasibility test use karke prune karta hai (kya yeh partial state koi constraint violate karta hai). Dono tree-search skeleton share karte hain lekin different pruning questions poochte hain.

Error dhundho

Error dhundho: if r == n: res.append(board) (N-Queens, live board object store karte hue).
board mutate hota rehta hai jaise search continue hoti hai, isliye har stored solution baad mein usi state ki taraf point karti hai (aksar empty board). Tumhe ek deep snapshot store karna hoga, e.g. [''.join(row) for row in board].
Error dhundho: Ek student queen placement ko recurse karne ke baad validate karta hai, "loop simple rakhne ke liye".
Yeh pruning bahut late hai — tum already ek doomed placement ke poore subtree ko explore kar chuke ho, jo sirf brute force hai. Validity check pehle apply se honi chahiye taaki dead branches upar hi mar jayein.
Error dhundho: N-Queens diagonal check sirf cols aur diag = r - c use karta hai, r + c chhodkar.
Anti-diagonal (↗) miss ho jaati hai, isliye do queens jahan r1 + c1 == r2 + c2 slip through karke ek doosre par attack karti hain. Dono diagonals track karni hain: r - c ↘ ke liye aur r + c ↗ ke liye.
Error dhundho: Permutations mein writer path.pop() karta hai lekin used[i] = False bhool jaata hai.
Value path se nikal jaati hai lekin used mark rahti hai, isliye element i baad ki branches ke liye permanently unavailable ho jaata hai — tum truncated, missing permutations paaoge. choose mein har mutation ka mirror un-choose mein hona chahiye.
Error dhundho: Sudoku ok(r,c,ch) row aur column check karta hai lekin box nahi.
Solutions box constraint violate karengi. Box test board[(b//3)*3 + i//3][(b%3)*3 + i%3] bhi run hona chahiye, jahan b = (r//3)*3 + c//3.
Error dhundho: Subsets mein, writer copy append karta hai lekin "take" branch ke baad kabhi path.pop() call nahi karta.
Pop ke bina, path elements accumulate karta rehta hai, isliye parent node par wapas aane par state polluted hai aur sibling subsets galat nikalti hain. Un-choose path ko wahi restore karta hai jo parent expect karta hai.
Error dhundho: Ek learner likhta hai if valid: apply; recurse lekin un-choose ko if ke bahar rakhta hai, isliye yeh tab bhi run hota hai jab choice kabhi apply hi nahi ki gayi.
Tum tab ek mutation undo karte ho jo kabhi hui hi nahi (ek column remove karna jo kabhi add nahi hua), sets corrupt ho jaate hain ya error aata hai. Un-choose apply ke saath usi block ke andar hona chahiye, one-to-one pair karte hue.

Why questions

Kyun one-queen-per-row branching ko se tak ghataata hai?
Exactly ek queen per row fix karna row ko free choice se hata deta hai: har row ke liye hum sirf ek column choose karte hain ( options), aur row conflicts structurally impossible ho jaate hain instead of kuch jise test karna padhe.
Kyun hum poori ↘ diagonal ko single number r - c se encode kar sakte hain?
Down-right ek step chalane par r aur c dono mein 1 add hota hai, isliye unka difference r - c us diagonal par kabhi nahi badalta. Ek constant poori line identify karta hai, conflict test banaata hai.
Kyun Sudoku ka solver boolean return karta hai jabki N-Queens kuch nahi return karta?
Sudoku ek single solution chahta hai, isliye boolean signal karta hai "mila — ruko". N-Queens har solution chahta hai, isliye short-circuit karne ke liye kuch nahi hai; yeh sab branches explore karta hai aur results ek shared list mein accumulate karta hai.
Kyun Recursion-and-the-call-stack backtracking ke liye natural machinery hai?
Har recursive frame automatically yaad rakhta hai "main kahan tha aur aage kya try karna hai"; jab ek branch marr jaati hai aur call return hoti hai, the stack caller ki position free mein restore kar deta hai — exactly wahi "last fork par wapas chalo" behavior.
Kyun early pruning poora point hai na ki sirf ek minor optimisation?
Doomed configurations ki sankhya combinatorially badhti hai (8 queens ke liye billions). Depth 2 par ek branch marna har ek descendant ko skip karta hai jo woh generate karta — isliye pruning kaam ki growth rate badalta hai, na sirf ek constant factor.
Kyun hum N-Queens aur Sudoku ko Constraint-Satisfaction-Problems ke roop mein dekh sakte hain?
Dono variables ko values assign karte hain (queen columns / cell digits) "all-different" constraints ke subject to rows, columns, diagonals ya boxes par; backtracking ek satisfying assignment ke liye standard systematic search hai.
Kyun standard subset/permutation backtracking Dynamic-Programming jaisi memoisation use nahi karta?
DP overlapping subproblems ke answers reuse karta hai, lekin yahan hume har distinct subset/permutation emit karni hai — reuse karne ke liye kuch nahi hai aur koi shared optimal value nahi hai; har leaf ek unique required output hai.
Kyun pure permutation generation ki running time used check ke saath bhi rehti hai?
Produce karne ke liye leaves hain aur har ek ko result mein copy karne mein lagta hai; used prune sirf invalid repeats hataata hai, valid orderings nahi, isliye real solutions ki count — aur is tarah kaam ka floor — unchanged rehta hai.

Edge cases

Edge case: subsets([]) (empty input) — kya return hoga?
[[]] — ek list jisme single empty subset hai. Base case i == len(nums) turant ek empty path ke saath fire hota hai, correctly subset deta hai.
Edge case: permute([]) — kya return hoga?
[[]] — ek permutation, empty ordering, kyunki . len(path) == len(nums) turant true ho jaata hai.
Edge case: aur ke liye N-Queens — kitne solutions?
Dono ke liye zero. Search correctly run hoti hai, har attempt prune ho jaata hai, aur empty list return hoti hai — ek valid answer jiska matlab hai "koi arrangement exist nahi karta", bug nahi.
Edge case: ke liye N-Queens.
Exactly ek solution: akele square par ek queen, koi conflicts possible nahi. Loop use place karta hai aur r == n base case use record karta hai.
Edge case: Solver ko aisa Sudoku puzzle diya jaye jisme koi empty cells nahi hain.
bt() koi '.' nahi paata, return True par pahunch jaata hai, aur board ko waise hi chhod deta hai — already-complete grid ko sahi tarah se solved report karta hai bina kuch touch kiye.
Edge case: Ek unsolvable Sudoku (givens mein contradiction).
Kisi empty cell par har digit ok fail karta hai, har level False return karta hai, aur recursion poori tarah unwind ho jaati hai board ko original state mein chhod kar — solver simply tree exhaust karta hai aur no solution report karta hai.
Edge case: subsets ya permute jab nums mein duplicates hain.
Plain templates positions ko distinct maante hain, isliye duplicate values duplicate outputs produce karti hain (e.g. [1,1] repeated permutations deta hai). Unhe hatane ke liye extra sort-and-skip rule chahiye — base template apne aap dedupe nahi karta.

Recall Jaane se pehle one-line self-test

Cover karo aur bolke sunao: teen magic words kya hain, aur kaun sa woh trap hai jo sabse zyada bhool jaate hain? Answer ::: Choose → explore → un-choose; bhoolne wala hai un-choose, jo shared state restore karta hai taaki sibling branches clean shuru hon.