मान लीजिए कि हमने एक 9×9 मैट्रिक्स दिया है जिसे सुडोकू कहा जाता है। कार्य यह जांचना है कि दिया गया सुडोकू पैटर्न मान्य है या नहीं।
सामान्य तौर पर, सुडोकू बोर्ड इस तरह दिखता है,
सुडोकू के नियम -
-
प्रत्येक पंक्ति में 1-9 की श्रेणी में एक संख्या होती है
-
प्रत्येक कॉलम में 1-9 की श्रेणी में संख्याएँ होती हैं।
-
3×3 के प्रत्येक ब्लॉक में अद्वितीय संख्याएँ होती हैं।
-
किसी विशेष पंक्ति में समान संख्या नहीं हो सकती।
-
किसी विशेष कॉलम में समान संख्या नहीं हो सकती।
उदाहरण के लिए
इनपुट-1 -
sudoku[]= [["3","5",".",".","2",".",".",".","."] ,["7",".",".","1","6","5",".",".","."] ,[".","9","8",".",".",".",".","6","."] ,["8",".",".",".","6",".",".",".","3"] ,["4",".",".","5",".","4",".",".","1"] ,["7",".",".",".","2",".",".",".","6"] ,[".","6",".",".",".",".","2","8","."] ,[".",".",".","4","1","9",".",".","5"] ,[".",".",".",".","8",".",".","7","9"]]
आउटपुट - सच।
स्पष्टीकरण - चूंकि सुडोकू मैट्रिक्स के अंदर की सभी संख्याएं एक मान्य सुडोकू के पैटर्न का पालन करती हैं, इसलिए आउटपुट सही है।
इस समस्या को हल करने का तरीका
प्रारंभ में हम जांच करेंगे कि दिए गए सुडोकू बोर्ड में अद्वितीय संख्याओं वाला कॉलम है या नहीं। फिर हम पंक्ति की जांच करेंगे। प्रत्येक 3*3 ब्लॉक में सभी अद्वितीय संख्याएँ होती हैं। हम प्रत्येक ब्लॉक पंक्ति और ब्लॉक कॉलम की जांच करेंगे यदि इसमें कोई संख्या डुप्लिकेट है तो हम झूठी वापसी करेंगे अन्यथा सत्य वापस आ जाएंगे।
-
सुडोकू बोर्ड के लिए 2-डी सरणी का इनपुट लें।
-
पंक्ति की जाँच करने के लिए एक बूलियन फ़ंक्शन है कि उसमें मौजूद तत्व अद्वितीय हैं या नहीं।
-
कॉलम की जांच करने के लिए एक बूलियन फ़ंक्शन है कि इसमें मौजूद तत्व अद्वितीय हैं या नहीं।
-
एक बूलियन फ़ंक्शन यह जांचने के लिए है कि ब्लॉक में मौजूद तत्व अद्वितीय हैं या नहीं।
उदाहरण
#include<bits/stdc++.h> using namespace std; bool validSudoku(vector<vector<char>>& sudoku) { int row = 0, col = 0, i = 0, block = 0; int count[9]; for (row = 0; row < 9; ++row){ memset(count, 0, 9 * sizeof(int)); for (col = 0; col < 9; ++col){ if (sudoku[row][col] != '.') ++count[sudoku[row][col]-'1']; } for (i = 0; i < 9; ++i) if (count[i] > 1) return false; } for (col = 0; col < 9; ++col){ memset(count, 0, 9 * sizeof(int)); for (row = 0; row < 9; ++row){ if (sudoku[row][col] != '.') ++count[sudoku[row][col]-'1']; } for (i = 0; i < 9; ++i) if (count[i] > 1) return false; } int block_row = 0, block_col = 0; for (block = 0; block < 9; ++block){ block_row = (block / 3) * 3, block_col = (block % 3) * 3; memset(count, 0, 9 * sizeof(int)); for (row = block_row; row < (block_row + 3); ++row) for (col = block_col; col < (block_col + 3); ++col) if (sudoku[row][col] != '.') ++count[sudoku[row][col] - '1']; for (i = 0; i < 9; ++i) if (count[i] > 1) return false; } return true; } int main(){ vector<vector<char> > sudoku= { {'5','3','.','.','7','.','.','.','.'}, {'6','.','.','1','9','5','.','.','.'}, {'.','9','8','.','.','.','.','6','.'}, {'8','.','.','.','6','.','.','.','3'}, {'4','.','.','8','.','3','.','.','1'}, {'7','.','.','.','2','.','.','.','6'}, {'.','6','.','.','.','.','2','8','.'}, {'.','.','.','4','1','9','.','.','5'}, {'.','.','.','.','8','.','.','7','9'} }; bool ans= validSudoku(sudoku); if(ans){ cout<<"True"<<endl; } else { cout<<"false"<<endl; } return 0; }
आउटपुट
True