मैं अपने प्रोग्राम 2 डी-सरणी में उपयोग करके नाबालिगों को प्राप्त करने के लिए मैट्रिक्स के शून्य को स्थानांतरित करने का प्रयास कर रहा हूं। 2d-सरणी के तत्वों को सही ढंग से कैसे हटाएं (शिफ्ट) करें?

मुझे पता है कि इस समस्या को 1d-सरणी के साथ इसके तत्व की अनुमति देकर कैसे संभालना है

for (int i = DEL; i < (SIZE - 1); i++)
    array[i] = array[i + 1];

जहां DEL - तत्व का सूचकांक, जिसे हम हटाना चाहते हैं, SIZE - सरणी का आकार। लेकिन मुझे बहुआयामी-सरणी के साथ समान परिणाम नहीं मिला है:

for (int i = DEL; i < (SIZE - 1); i++)
    for (int j = DEL; j < (SIZE - 1); j++)
        array[i][j] = array[i+1][j+1];

गलती कहाँ है?

#include <iostream>

using namespace std;

int main()
{
    int array[3][3] = {
        1, 2, 3,
        4, 5, 6, 
        7, 8, 9};

    // Setting to zero 2nd row and 3rd column
    int m = 1; // 2
    int n = 2; // 3


    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            array[m][j] = 0;
            array[i][n] = 0;
            cout << array[i][j];
            // Trying to shift every element, which equals zero
            if (array[i][j] == 0)
                for (int k = i; k < 2; k++)
                    for (int l = j; l < 2; l++)
                        array[k][l] = array[k+1][l+1];          

        }
        cout << endl;
    }



    cout << endl;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            cout << array[i][j];
        cout << endl;
    }
}

मुझे समझ आ गया:

120
000
780

120
000
780

लेकिन असल में मैं चाहता हूं कि आखिरी आउटपुट ऐसा हो:

120
780
000
0
Pr.Germux 12 जुलाई 2019, 21:59

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि "परम्यूटिंग" शब्द यहां फिट नहीं है। आप 2 आयामी सरणी से पंक्तियों और स्तंभों को हटाना चाहते हैं।

हालाँकि आपने कुछ शब्दार्थ त्रुटियाँ की हैं। मैंने इसे आपके लिए ठीक कर दिया है और आपको नीचे सही कोड दिखा रहा हूं।

एक बड़ी सलाह। एक बड़ी समस्या को कई छोटी समस्याओं में बदलने का प्रयास करें। आप लूप के लिए बहु-नेस्टेड में बहुत अधिक प्रयास कर रहे हैं। एक के बाद एक करें।

कृपया देखें:

#include <iostream>

constexpr size_t MaxArraySize = 3;

int main()
{
    int array[MaxArraySize][MaxArraySize] = {
        1, 2, 3,
        4, 5, 6,
        7, 8, 9 };

    // Setting to zero 2nd row and 3rd column
    int rowToDelete = 1; // 2
    int colToDelete = 2; // 3

    // Set cell to delete to 0
    for (int row = 0; row < MaxArraySize; ++row)
    {
        for (int col = 0; col < MaxArraySize; ++col)
        {
            array[rowToDelete][col] = 0;
            array[row][colToDelete] = 0;
            std::cout << array[row][col];
        }
        std::cout << '\n';
    }

    // First shift all rows
    for (int row = rowToDelete; row < MaxArraySize - 1; ++row)
        for (int col = 0; col < MaxArraySize; ++col)
            array[row][col] = array[row+1][col];

    // Then shift all cols
    for (int col = colToDelete; col < MaxArraySize-1; ++col)
        for (int row = 0; row < MaxArraySize; ++row)
            array[row][col] = array[row][col+1];

    // Set the cells that were shifted away to 0
    for (int row = 0; row < MaxArraySize; ++row)
        array[row][MaxArraySize - 1] = 0;
    for (int col = 0; col < MaxArraySize; ++col)
        array[MaxArraySize - 1][col] = 0;

    // Show result
    std::cout << "\n\nResult\n\n";
    for (int row = 0; row < MaxArraySize; ++row)
    {
        for (int col = 0; col < MaxArraySize; ++col)
            std::cout << array[row][col];
        std::cout << '\n';
    }
}

दूसरा और इससे भी महत्वपूर्ण। आप सादे सी-स्टाइल सरणियों के साथ सादे सी कोड का उपयोग कर रहे हैं। आपके कोड में केवल C++ iostreams का उपयोग कर रहा है। यह इतना अच्छा नहीं है।

सी ++ का उपयोग करने का प्रयास करें। कभी भी सादे सी-स्टाइल सरणी का उपयोग न करें। एसटीएल से एल्गोरिदम और कंटेनरों का उपयोग करने का प्रयास करें। चर के लिए बेहतर नामों का प्रयोग करें।

कोड का परिणामी टुकड़ा अति सरल होगा। और यहां हम वास्तव में पंक्तियों और स्तंभों को हटा रहे हैं। कृपया देखें:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    // Lambda for printing the matric to std::cout
    auto print = [](std::vector<std::vector<int>> & m) {
        std::for_each(m.begin(), m.end(), [](std::vector<int> & vi) { std::copy(vi.begin(), vi.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; });
    };
    // You can add whatever values. 
    std::vector<std::vector<int>> matrix {
        {11, 12, 13, 14},
        {15, 16, 17, 18},
        {19, 20, 21, 22},
        {23, 24, 25, 26}
    };
    // Show initial data
    std::cout << "\n\nInitial matrix:\n";
    print(matrix);

    constexpr size_t RowToDelete = 1; // Row 2
    constexpr size_t ColToDelete = 2; // Column3

    // Erase row
    matrix.erase(matrix.begin() + RowToDelete);
    // Erase column in each row
    std::for_each(matrix.begin(),matrix.end(), [ColToDelete](std::vector<int> & vi) { vi.erase(vi.begin() + ColToDelete); });

    // Show result
    std::cout << "\n\nResulting matrix with deleted row " << RowToDelete+1 << " and deleted column " << ColToDelete+1 << '\n';
    print(matrix);

    return 0;
}

उम्मीद है की यह मदद करेगा । . .

2
Armin Montigny 13 जुलाई 2019, 06:56