L15. Sudoko Solver | Backtracking
Vložit
- čas přidán 11. 05. 2021
- Check our Website:
In case you are thinking to buy courses, please check below:
Link to get 20% additional Discount at Coding Ninjas: bit.ly/3wE5aHx
Code "takeuforward" for 15% off at GFG: practice.geeksforgeeks.org/co...
Code "takeuforward" for 20% off on sys-design: get.interviewready.io?_aff=takeuforward
Crypto, I use the Wazirx app: wazirx.com/invite/xexnpc4u
Take 750 rs free Amazon Stock from me: indmoney.onelink.me/RmHC/idje...
Earn 100 rs by making a Grow Account for investing: app.groww.in/v3cO/8hu879t0
Linkedin/Instagram/Telegram: linktr.ee/takeUforward
---------------------------------------------------------------------------------------------------------------------------------------------------- Pre-Requisites: Recursion Playlist Videos,
✅Coding Ninjas Discount Link: aff.codingninjas.com/click?o=...
Please Please SUBSKRIIIBEEEEE the new channel: / @striver_79
Problem Link: leetcode.com/problems/sudoku-...
C++/Java Code Efficient: takeuforward.org/data-structu...
---------------------------------------------------------------------------------------------------------------------------
✅This is where I teach: ----- Use coupon-code "TAKEUFORWARD" for getting 10% on my course at GFG: bit.ly/striver_cpCourse
✅Use coupon-code "TAKEUFORWARD" for getting 10% for all GFG courses: bit.ly/tuf_gfgCourse
---------------------------------------------------------------------------------------------------------------------------
If you appreciate the channel's work, you can join the family: bit.ly/joinFamily
✅Thumbnail Creator: / rikonakhuli
✅ Striver's Linkedin Profile: /
✅ Instagram: /
✅Connect with us: bit.ly/tuftelegram (Use Link in Mobile only, if not works search "takeUforward" in telegram)..
#dsa #striver #placements
Instagram for live updates about channel and live sessions: striver_79
Bhaiya you are just a mastermind not only by your skills but you know the every bit of doubts that arise in a student's mind.
Hats off to your explanation skills. 🔥🔥🔥❤️
Wo sare sudoku boards bharte bharte dimag kharab ho gaya hoga XD
You are doing one revolutionary work. Word will change and remember your contribution.
@@democratcobra Er....Which *word* will change?
Lol ! Am i the only one who learnt sudoku games just to solve this problem. 😂
Those who can't understand the logic for subgrid part of sudoku can think of like -
There are 3 sized rows and columns so we have to do row/3 and column/3 to get what specific subgrid we are in !!! But this will not be enough as we have to traverse whole subgrid also, so we have to add various coordinates like -
offset is nothing but first element of subgrid
offset(which we can get by row//3 and col//3)
+ for each of given below
(0,0) (0,1),(0,2),
(1,0) (1,1),(1,2),
(2,0) (2,1),(2,2)
offset + (0,0)
offset + (0,1)
offset + (0,2)
offset + (1,0)
offset + (1,1)
offset + (1,2)
offset + (2,0)
offset + (2,1)
offset + (2,2)
For example if we talk about what striver talks about at 19:24 (5,7) position
we can get subgrid offset by
row offset = 5//3 ==>1
col offset = 7//3 ==> 2
which is second rowth and third column subgrid -
| 0,0 | 0,1 | 0,2 |
| 1,0 | 1,1 | 1,2 |
| 2,0 | 2,1 | 2,2 |
The above is all 9 subgrid of sudoku
Again back with example we get 1,2 grid and now we have to add all coordinates to traverse that block
like
(0,0) (0,1),(0,2),
(1,0) (1,1),(1,2),
(2,0) (2,1),(2,2)
for x= 0,0,0,1,1,1,2,2,2 ( extracting all x of above )
for y = 0,1,2,0,1,2,0,1,2 (extracting all y of above )
so basically x = i//3
and y = i%3 for i ranging from 0 to 9
so finally formula is
for i=0 to 9-
row = 3 * (x//3) + i//3 ==> (offset + 0,0,0,1,1,1,2,2,2 )
col = 3*(y//3) + i % 3 ==> (offset + 0,1,2,0,1,2,0,1,2 )
from where can i get the same deciphering technique ?? some resources ?
My suggestion would be to pass on the row number along with the board to solve function, because say you're calling solve(board) [recent insertion done at 6,7], the function again starts from the start(0) row to find an empty cell, but if you'd passed solve(board,row=6) the search starts from the same row as you're sure that there wouldn't be any free cells left in prior rows.
Yes definitely, It will save the iteration of the rows where values are already set. Now you just need to switch to the next row for which you will simply increment the value of row in the function call. I have applied this method, Below the python Implementation of the problem:
class Solution:
def isValid(self,board,row,col,val):
for i in range(9):
if (board[row][i] == val):
return False
if (board[i][col] == val):
return False
if(board[3*(row//3)+(i//3)][3*(col//3)+(i%3)] == val):
return False
return True
def solve(self,board,row):
if (row == 9):return True
for col in range(9):
if(board[row][col] == '.'):
for val in map(str,range(1,10)):
if self.isValid(board,row,col,val):
board[row][col] = val
if self.solve(board,row):
return True
else:
board[row][col] = "."
return False
return self.solve(board,row+1)
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
self.solve(board,0)
Very true. That is an important point
It would have mattered more if number of rows/columns was huge. In this question, we only have to do it for 9, so won't really make more than a very very slight difference at all.
yes@@user-lw4vr8oo4x
I heard u many times saying u r bad at drawing bt this suduko board is literally very artistic
Yesterday I was trying to understand Sudoku for this problem. And here you come with perfect explanation. Thank you 🙂
what is the TC for this ques ? please explain , please help me , thanks..
@@freshcontent3729 for each empty box, we have 9 choices (1-9), therefore maximum tc is 9^N*N, where N is dimension of grid.
Best Explanation and consistent logic over all recursion backtracking question in the series. Great work
Hey King take this 👑, it belongs to you now.
The best explanation on YT for this problem. I can never forget the logic ever :) Thank you
I was initially stucked at the place where we have to check whether the sub-matrix is filled from 1-9 or not but the way you have explained it by diving the rows and colums by 3 and adding them to check the all the numbers made me Mind blown ..this is the far best Explanation ,loved it
thanks a lot, sir for boosting my confidence that i can do programming by just applying common sense
Really appreciate your efforts brother, took time but really happy to solve the question just by watching intuition.
I am getting this error when i am submitting my soln in leetcode
can anyone please help?
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef164fff8 (pc 0x000000345d18 bp 0x7ffef1650010 sp 0x7ffef1650000 T0)
==30==ABORTING
Appreciate the effort that you have put to explain this problem.
Hella understood man. Ig the most tricky part of this question was to check for 3*3 matrix, that you explained really well.
bro, I salute your patience! I never have seen such an explanation for the problem! Thanks a lot.
N queens problem and sudoku solve were not as easy as it seems now after going through your videos. Best thing I have found on CZcams. Thanks a lot for making such complex things easier to understand.
Superb Explanation Bhaiya . I know how much efforts u put to come with a beautiful content .Hats off for u
Best explanation for sudoku solver on CZcams 💯
Bhaiya before I was feeling recursion a tough topic but seeing your video now i am enjoying doing recursion thanks lot bahiya for providing such contents.
Great work, We can also solve this problem with out nested loops by passing row number as parameters to reduce the complexity.
No for iterations it's not possible
@@ka_ka3141it is possible python code:class Solution:
def isValid(self,k,r,c,board):
for i in range(9):
if board[i][c]==k:
return False
if board[r][i]==k:
return False
if board[3*(r//3)+i//3][3*(c//3)+i%3]==k:
return False
return True
def func(self,board,r):
for i in range(r,9):
for j in range(9):
if board[i][j]=='.':
for k in "123456789":
if self.isValid(k,i,j,board):
board[i][j]=k
if self.func(board,i):
return True
else:
board[i][j]='.'
return False
return True
def solveSudoku(self, board: List[List[str]]) -> None:
self.func(board,0)
the shear amount of effort that must have gone while making this video is certainly commendable... some of the best DSA channel for a reason... gg @takeUforward
exactlyy
Thanks a lot, haven't seen anyone explain so well and in such detail ! ^_^
Woah thanks for this bro :)
I literally never understood this problem and finally after watching your video I understood it completely.
Great explanation!! Really appreciate your efforts
Great explanation!.Thank you. Can you also please make a video on this backtracking leetcode question? "1240. Tiling a Rectangle with the Fewest Squares"
Understood! Super amazing explanation as always, thank you very much!!
Thank you for this wonderful explanation!.
Brilliant explaination. Great video. Thank you!
Your videos made questions like this too much easier.
Like I've seen Some other videos of Sudoku solver, and they all just used that formula, and said you can use this, but striver you really helped me understand the formula, And I just wanted to say Thank you!
Bhaiya I just love your videos . I have been following u since many months . Can u make videos about different projects and what should we learn while we work on our Ds algo .
Understood the concept. Thanks for putting this much effort.
What a simple solution to such a complex problem hats off to u sir
You are a true king in explaining logic!
Note: We don't need to write "Else". This is because in the if condition, we are anyways "return"ing
UNDERSTOOD.....Thank You So Much for this wonderful video........🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻
Great Explanation as always!
In the formula to check for the subgrid, I was thinking (3*(row/3) + i/3) can be simplified to (row + i/3), but then i figured we cant do this becuase the (row/3) operation will take the floor value.
for e.g.
if row = 5
row/3 = 5/3 = 1
so now, 3 * (row/3) = 3
But if we directly take row it will be 5 which is wrong!
I am getting this error when i am submitting my soln in leetcode
can anyone please help?
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef164fff8 (pc 0x000000345d18 bp 0x7ffef1650010 sp 0x7ffef1650000 T0)
==30==ABORTING
good note. I was thinking about this as well. Thanks for clearing it up.
Great effort. Very informative. Thanks @Striver.
The BEST video on this topic in youtube...Thank you!
Great explanation as always. Can you please explain its time and space complexity...
I understood very well, Thankyou for good explanation.
Thank you so much for the explanation
Learnt alot
amazing, really great explanation.
Amazing explaination!!
The best explanation on YT for this problem
There are 6,670,903,752,021,072,936,960 possible solvable Sudoku 😅 grids that yield a unique result (that's 6 sextillion, 670 quintillion, 903 quadrillion, 752 trillion, 21 billion, 72 million, 936 thousand, 960 in case you were wondering). That's way more than the number of stars in the universe
Into my list of greatest tutors.
thank you🙏 for your work, if we send row number in every recursion that will improve the code execution time further
Beautifully explained!
Crystal clear explanation as 🙏
This guy makes it so easy!
Bhaiya ap great ho..... #below tier3 ki inspiration ho ap.....
WHT A EXPLANATION !!!!
Killed it.....
for the 3x3 box checking I am still preferring the nested for loop rather than that formula, I know its not efficient but common we only have 9 values to check, so don't think it will make significant difference in runtime
really you made it very simeple.. Thanks for this video
Just a beautiful explanation. You are legend striver
I am getting this error when i am submitting my soln in leetcode
can anyone please help?
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef164fff8 (pc 0x000000345d18 bp 0x7ffef1650010 sp 0x7ffef1650000 T0)
==30==ABORTING
Thank you so much brother, please complete the sde sheet 🙏
If you know how to solve sudoku, you can start from 4:00
Exceptional explanation, Thanks a lot striver
Striver, I am supremely grateful for your content. You're the best! Btw, a given Sudoku puzzle can have only one valid solution unlike what you said at 12:23. But again this video is great just like all your other videos. You are the best!!! I have immense gratitude for your efforts.
no ,it can have many as well but It is a bad puzzle.
@@asutoshghanto3419 Yes, your point is valid but I was talking about a valid Sudoku puzzle
I am getting this error when i am submitting my soln in leetcode
can anyone please help?
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef164fff8 (pc 0x000000345d18 bp 0x7ffef1650010 sp 0x7ffef1650000 T0)
==30==ABORTING
The above solution Time complexity is about N**2 * 9**(n*n)
Python solution : O(N) : 9**(n*n)
See only if you find difficulty in building the code
m, n = 9, 9
res = []
def possible(x, y, c):
x, y = int(x), int(y)
for i in range(9):
if arr[i][y] == c: return False
if arr[x][i] == c: return False
if arr[3*(x//3) + i//3][3*(y//3) + i%3] == c: return False
return True
def solve(row, col):
if row == n: return True
if col == n: return solve(row+1, 0)
if arr[row][col] == ".":
for i in range(1, 10):
if possible(row, col, str(i)):
arr[row][col] = str(i)
if solve(row, col + 1):
return True
else:
arr[row][col] = "."
return False
else: return solve(row, col + 1)
solve(0, 0)
yes , n^2 is unnecessary increase in complexity.
Thank you very nicely explained
Hey striver I have a question.
In a book I read that by studying a topic with a gap makes it stick better in brain ex- Studying Graph today and taking a gap of 2 days and again studying graph.
Should I follow it or just take a topic and continue everyday on same topic
yes it definitely happens. For example in my case I take 1 month gap and after again revising the topic I find them easy to code and I feel my thinking skills gets better for that topic after taking that break
It does.
Thank you!
thank you so much bhaiya you made so many things in easy way
Great explanation! but it will only work for board size 9. A separate loop on ' board[3*(row/3) +i/3][3*(col/3) +i%3]==c ' can make it generic for all board size.
Python Code:
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
N=len(board)
for row in range(N):
for col in range(N):
if board[row][col]==".":
for num in range(1,N+1):
if(self.isValid(num,row,col,board,N)):
board[row][col]=str(num)
if(self.solveSudoku(board)):
return True
else:
board[row][col]="."
return False
return True
def isValid(self,num,row,col,board,N):
for i in range(N):
if str(num) == board[row][i]: return False
if str(num) == board[i][col]: return False
for i in range(9):
if str(num) == board[3*(row//3) +i//3][3*(col//3) +i%3]: return False
return True
I really liked this approach. I was thinking how many N can we logically use? i think just 2(4*4 suduko),4(16*16 suduko) because total possible squares and time complexity will not support much beyond that without really intense computational powers.
Getting timeout when board.size() & board[0].size() are replaced with 9. I thought it will be faster with hardcoded 9. Any idea why is it timing out with hardcoded value? Isn't it supposed to be faster with hardcoded value? Board length is given as 9 in constraints board.length == 9. BTW, amazing explanation.
paste your solution here, and then we can discuss
maybe instead of < 9 you may be doing
Mine worked properly
thank you so much bhaiya. :)
Nice explanation. Thanks
However I looped through the 3x3 matrix and checked the row and column using another variable. I think the time complexity is still same as I'm only looping 9 times.
here is the code:
bool isSafe(int r, int c, int val, int grid[n][n])
{
int idx = 0;
int row = 3 * (r/3);
int col = 3 * (c/3);
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(grid[idx][c] == val) return false;
if(grid[r][idx] == val) return false;
if(grid[row+i][col+j] == val) return false;
idx++;
}
}
return true;
}
Thank you for the wonderful solution keep doing sir
If anyone's looking for [ python ] solution, then here it is
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
self.solve(board)
def solve(self,board):
for i in range(9):
for j in range(9):
if board[i][j]=='.':
for c in range(1,10):
if self.checkvalid(board,i,j,str(c))==True:
board[i][j]=str(c)
if self.solve(board)==True:
return True
else:
board[i][j]='.'
return False
return True
def checkvalid(self,board,row,column,c):
for i in range(9):
if board[i][column]==c:
return False
if board[row][i]==c:
return False
if board[3*(row//3)+i//3][3*(column//3)+i%3]==c:
return False
return True
Well explained!!
iterating through 3x3 matrix was awesome
Aaapki videos dekhkr smjh aajata hai par 5-10 din baad lagao to phir bhoole bhatke se lgte hai Sir iska bataiye kuch.. Aise to kitne swaaal kitni baari practse krenge ...Bhaiya please any suggestion this is happening with me all a bit difficult ques which i wasn't able to solve myself did by watchng your video.. Like for exampple I did Flatteing question of LL .. I can't solve now w/o any help but at that time when i didi by learning from it stood like its cleared .. i have learned.. PLS REPLYYYYY SIRR
so basically rec for (1 to 9)
check1 , check2 , check3 (for 3 different check function) if yes go with the recursion else i+1
Awesomeee!!
GREAT EXPLANATION :::::)))))
Can we pass the indices row and col with matrix in solve() so that we check only the dots next to it?
Great explanation Thank You😀
I am getting this error when i am submitting my soln in leetcode
can anyone please help?
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef164fff8 (pc 0x000000345d18 bp 0x7ffef1650010 sp 0x7ffef1650000 T0)
==30==ABORTING
Thank you sooo mcuh :)))) Awesome :}}
Bhaiiii sahabbb vo Box ka idea toh matlab bilkul *Kamal* tha bhai..... I'm just like you not only achieved your dream but helping others also to achieve theirs.
*We must protect you at all cost brother*
Such amazing explanation... Thankyou so much 🙏🙏🙏
You are indeed a blessing for us man
@striver best explaination in easy manner
Very well explained sir
We can also use space to avoid the check right?
Could you please tell the time and space complexities of both the approaches?
Bhaiya ji , OP explnation!
This is what i needed
Thanks a lot striver :)
Can we optimize using a hashmap for row, col and box?
Awesome explanation
thank you so much
what is the TC for this ques ? please explain , please help me , thanks..
Bhaishbbb "itna dimaag kaha se laate ho", Amazing approach and wo matrix check to bs gazab hi he . Lg rha he service se product switch ho jayega.
Great explanation
Genius!!
bro please jaldi jaldi upload karo btw great help
this guy is godddddd hatss off man
can the formula be generalised for any n x m matrix ? or is it valid for square matrices only? According to my calculation for n x m smaller square, for an index [row][col] , for the boxes it should be [k1 + row/m][k2 + col%n] and k1 = n * (row/n) and k2 =m*(col/m) idk .......
I am getting this error when i am submitting my soln in leetcode
can anyone please help?
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef164fff8 (pc 0x000000345d18 bp 0x7ffef1650010 sp 0x7ffef1650000 T0)
==30==ABORTING
can anyoe please tell me...we have to write void function..but we are using boolean .. why we are considering return values??
one doubt i dont understand why cant we use three for loops to find the validity every for loop will do 9 checks and in total 27 checks , here your for loop is doing 3 checks at one iterations so it will also do 27 checks , so can u tell what am i missing here
Hare Krishna! Great🙏🙏
thank you :)