तो मैं सभी संभव प्रविष्टियों को पाने की कोशिश कर रहा हूँजिसे सुडोकू सिंगल स्क्वायर में रखा जा सकता है। मेरे पास एक 9x9 2 डी सरणी है, जिसे आगे 3x3 सबरेज़ में विभाजित किया गया है। मैं एक ऐसी विधि लिखना चाहता हूं जो अपने मापदंडों में एक पंक्ति और स्तंभ संयोजन लेती है और सभी विशिष्ट प्रविष्टियों को वापस करती है जो उस विशिष्ट स्थान पर बनाई जा सकती हैं। मेरी विधि के पहले 2 छोरों को पूरी पंक्ति और पूरे कॉलम में पहले से मौजूद सभी गैर-शून्य मानों को लिया गया है जो उन्हें निर्दिष्ट किया गया है और उन्हें एक सरणी में संग्रहीत करता है (पहले से ही), यह बाद के चरण में पता लगाने के लिए उपयोग किया जाएगा कि क्या नंबर पहले से उपयोग नहीं किए गए हैं। तीसरा, लूप पंक्ति, स्तंभ संयोजन का उपयोग करते हुए, विशिष्ट सबरे को ढूंढना चाहिए और इसकी प्रविष्टियों को पहले से ही-सरणी में जोड़ना चाहिए।
क्या दी गई पंक्ति, 2 डी सरणी के कॉलम का उपयोग करते हुए सबर्रे के कॉलम को खोजने का कोई तरीका है?
// Method for calculating all possibilities at specific position
public int[] getPossibilities(int col, int row){
int [] possibilities;
int [] alreadyInUse = null;
int currentIndex = 0;
if(sudoku[row][col] != 0){
return new int[]{sudoku[col][row]};
}
else{
alreadyInUse = new int[26];
//Go into Row x and store all available numbers in an alreadyInUse
for(int i=0; i<sudoku.length; i++){
if(sudoku[row][i] !=0){
alreadyInUse[currentIndex] = sudoku[row][i];
currentIndex++;
}
}
for(int j=0; j<sudoku.length; j++){
if(sudoku[j][col] !=0){
alreadyInUse[currentIndex] = sudoku[j][col];
currentIndex++;
}
}
for(int k=...???
}
return possibilities;
}
उत्तर:
जवाब के लिए 2 № 1आप उप सरणी को फ़िल्टर करने के लिए मापांक का उपयोग कर सकते हैं। उदाहरण के लिए, ऐसा करने का एक तरीका अभिव्यक्ति का उपयोग करना होगा n - (n % 3)
। उदाहरण के लिए, यदि पंक्ति 8 कॉलम (0 अनुक्रमित सरणी में अंतिम स्तंभ) है, तो यह अभिव्यक्ति 6. वापस आ जाएगी भी कॉलम 6 के लिए 6 लौटें, लेकिन यह कॉलम 5 के लिए 3 लौटेगा।
फिर, जब आपके पास शीर्ष बाएं सेल होता है, तो आप नेस्टेड लूप का उपयोग करके सभी 9 कोशिकाओं के माध्यम से लूप कर सकते हैं, एक बार में तीन।
यहाँ प्रासंगिक कोड है:
int x_left = (row - (row % 3));
int y_top = (col - (col % 3));
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(sudoku[i + x_left][j + y_top] != 0) {
alreadyInUse[currentIndex] = sudoku[i + x_left][j + y_top];
currentIndex++;
}
}
}