2010-02-27 15 views
5

मैं लिख रहा हूं एक सुडोकू पहेली सॉल्वर के लिए स्याही के वैक्टरों के वैक्टरों के साथ काम करने की कोशिश कर रहा हूं।मैं सी ++ में नेस्टेड वैक्टर के साथ कैसे काम करूं?

प्रश्न 1:

मैं सूचकांक द्वारा एक मेरी 2d सदिश का उपयोग करने के लिए जा रहा हूँ, मैं उचित आकार पहले से यह प्रारंभ करने की क्या ज़रूरत है?

उदाहरण के लिए:

typedef vector<vector<int> > array2d_t; 

void readAPuzzle(array2d_t grid) 
{ 
    for(int i = 0; i < 9; i++) 
     for(int j = 0; j < 9; j++) 
      cin >> grid[i][j]; 
    return; 
} 

int main() 
{ 
    array2d_t grid; 
    readAPuzzle(grid); 
} 

फॉल्ट का होगा। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह ग्रिड के elments तक पहुंचने का प्रयास कर रहा है जिसे अभी तक शुरू नहीं किया गया है?

मैं के साथ ग्रिड की घोषणा लाइन बदली है:

array2d_t grid(9, vector<int>(9, 0)); 

और यह इस SEG गलती से छुटकारा पाने के लिए लगता है। क्या इसे संभालने का यह सही तरीका है?

प्रश्न 2:

ऐसा क्यों है कि जब मैं CIN से मेरे ग्रिड में पढ़ने की कोशिश करें, और फिर बाहर ग्रिड प्रिंट, ग्रिड खाली है है?

मैं निम्नलिखित कोड का उपयोग कर रहा ऐसा करने के लिए:

void printGrid(array2d_t grid) 
{ 
    for (int i = 0; i < 9; i++) 
    { 
     for (int j = 0; j < 9; j++) 
     { 
      cout << grid[i][j] + " "; 
     } 
     cout << endl; 
    } 
} 

void readAPuzzle(array2d_t grid) 
{ 
    for(int i = 0; i < 9; i++) 
     for(int j = 0; j < 9; j++) 
      cin >> grid[i][j]; 

    return; 
} 

int main() 
{ 
    array2d_t grid(9, vector<int>(9, 0)); 
    printGrid(grid); 
    readAPuzzle(grid); 
    printGrid(grid); 
} 

और मैं तरह मेरे कार्यक्रम चलाने के लिए प्रयास:

./a.out < sudoku-test 

कहाँ सुडोकू परीक्षण निम्नलिखित वाली फ़ाइल है:

3 0 0 0 0 0 0 0 0 
5 8 4 0 0 2 0 3 0 
0 6 0 8 3 0 0 7 5 
0 4 1 0 0 6 0 0 0 
7 9 0 0 2 0 0 5 1 
0 0 0 9 0 0 6 8 0 
9 3 0 0 1 5 0 4 0 
0 2 0 4 0 0 5 1 8 
0 0 0 0 0 0 0 0 6 

printGrid() के लिए पहली कॉल जब बजाय मैं का एक 9x9 ग्रिड को देखकर किया जाना चाहिए एक खाली ग्रिड, देता है 0 के बाद से मैंने इसे कैसे शुरू किया। दूसरी कॉल में ऊपर ग्रिड होना चाहिए। हालांकि, दोनों बार यह खाली है।

क्या कोई इस पर कुछ प्रकाश डाल सकता है?

+0

चेकआउट boost.multi_array अगर आप गतिशील बहुआयामी डेटा – Anycorn

उत्तर

5

प्रश्न 1: हाँ, इसे संभालने का यह सही तरीका है। हालांकि, ध्यान दें कि नेस्टेड वैक्टर एक 2 डी सरणी को लागू करने के लिए एक अक्षम अक्षम तरीका हैं। x + y * width द्वारा एक वेक्टर और गणना सूचकांक आमतौर पर एक बेहतर विकल्प होता है।

क्यू 2 ए: grid[i][j] + " " की गणना दो स्ट्रिंग्स को संगत नहीं करती है (क्योंकि बाईं ओर की ओर int है, एक स्ट्रिंग नहीं है) बल्कि इसके बजाय संख्यात्मक मान को पॉइंटर (स्ट्रिंग के पहले अक्षर का स्मृति पता) जोड़ता है। इसके बजाय cout << grid[i][j] << " " का उपयोग करें।

क्यू 2 बी: readAPuzzle के लिए आप मान द्वारा सरणी (इसे कॉपी किया जाता है) पास कर रहे हैं। यह फ़ंक्शन अपनी स्थानीय प्रतिलिपि में पढ़ता है, जो फ़ंक्शन लौटाता है जब नष्ट हो जाता है। बजाय संदर्भ को पार करें (यह एक प्रतिलिपि बनाने से बचा जाता है और इसके बजाय मूल का उपयोग करता है):

void readAPuzzle(array2d_t& grid) 
+0

@Tronic, आह मैं देख रहा हूँ से निपटने के लिए आसान रास्ता चाहते हैं। मैंने सोचा था कि वैक्टरों के लिए डिफ़ॉल्ट व्यवहार संदर्भ द्वारा पारित किया जाएगा, जैसे सरणी करते हैं। – Salaban

+0

यह स्पष्ट नहीं करता है कि पहला प्रिंटग्रिड() मुझे 0 9 का 9 x 9 ग्रिड क्यों नहीं देता है?यदि इसकी प्रतिलिपि बनाई गई है, तो छपाई के दौरान शून्य अभी भी उपस्थित होना चाहिए। – Salaban

+0

Arrays एक अजीब विशेष मामला हैं। मैं यह नहीं कहूंगा कि सरणी संदर्भ द्वारा पारित की जाती हैं, बल्कि जब आप लिखते हैं [], तो आपको वास्तव में एक सूचक मिलता है (जिसे तब मूल्य से पारित किया जाता है)। यह परिप्रेक्ष्य का मामला है, यद्यपि। – Tronic

संबंधित मुद्दे