কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রামিং-এ O(1) এক্সট্রা স্পেসে n×n স্পাইরাল ম্যাট্রিক্স প্রিন্ট করা


একটি পজিটিভ ইন্টিজার n দেওয়া থাকলে, n×n সাইজের একটি স্পাইরাল ম্যাট্রিক্স প্রিন্ট করতে হবে শুধু O(1) এক্সট্রা স্পেস ব্যবহার করে ক্লকওয়াইজ (clockwise) দিকều।

স্পাইরাল ম্যাট্রিক্স হলো একটি ম্যাট্রিক্স যা স্পাইরালের মতো কাজ করে — বৃত্তের কেন্দ্র থেকে শুরু করে ক্লকওয়াইজ ঘুরে। টাস্ক হলো ম্যাট্রিক্সকে স্পাইরাল ফর্মে প্রিন্ট করা ২ → ৪ → ৬ → ৮ → ১০ → ১২ → ১৪ → ১৬ → ১৮ সিকোয়েন্সে।

সি প্রোগ্রামিং-এ O(1) এক্সট্রা স্পেসে n×n স্পাইরাল ম্যাট্রিক্স প্রিন্ট করা

উদাহরণ

Input: 3
Output:
18 16 14
4  2  12
6  8  10

আনলিমিটেড স্পেসে সমাধান সহজ কিন্তু এফিশিয়েন্ট নয়। সেরা প্রোগ্রাম হলো যা মেমোরি এবং টাইম দুটোই দক্ষ। চারটি লুপ (টপ, রাইট, বটম, লेफট) না ব্যবহার করে ম্যাট্রিক্সকে দুটি অংশে ভাগ করা যায়: আপার রাইট (upper right) এবং লোয়ার লেফট (lower left)।

ফর্মুলা:

  • Upper right half: mat[i][j] = (n-2x)² - (i-x) - (j-x)
  • Lower left half: mat[i][j] = (n-2x-2)² + (i-x) + (j-x)

নোট: এখানে ২-এর গুণফল প্রিন্ট করা হয়েছে।

অ্যালগরিদম

int spiralmatrix(int n)
START
STEP 1: DECLARE i, j, a, b, x
STEP 2: LOOP i = 0 to n-1
    LOOP j = 0 to n-1
        a = min(i, j)
        b = min(n-1-i, n-1-j)
        x = min(a, b)  // layer number
        IF i <= j THEN
            PRINT 2 * ((n-2x)² - (i-x) - (j-x))
        ELSE
            PRINT 2 * ((n-2x-2)² + (i-x) + (j-x))
    END LOOP
    PRINT NEWLINE
END LOOP
STOP

সি প্রোগ্রাম

#include <stdio.h>

int spiralmatrix(int n) {
    int i, j, a, b, x;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            a = (i < j ? i : j);
            b = ((n-1-i) < (n-1-j) ? (n-1-i) : (n-1-j));
            x = (a < b ? a : b);
            if (i <= j)
                printf("%d\t", 2 * ((n-2*x)*(n-2*x) - (i-x) - (j-x)));
            else
                printf("%d\t", 2 * ((n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)));
        }
        printf("\n");
    }
}

int main() {
    int n = 3;
    spiralmatrix(n);
    return 0;
}

আউটপুট

18 16 14
4  2  12
6  8  10

  1. C প্রোগ্রামিং-এ স্কোয়ার ম্যাট্রিক্সকে Z ফর্মে (Z Form) প্রিন্ট করা

  2. সি প্রোগ্রামিং-এ ম্যাট্রিক্স ডায়াগোনাল প্যাটার্নে সংখ্যা প্রিন্ট করা

  3. C প্রোগ্রামে ম্যাট্রিক্সকে ডায়াগোনালি নিচের দিকে প্রিন্ট করা

  4. C প্রোগ্রামে এক্সট্রা স্পেস ছাড়া লিংকড লিস্ট উল্টে প্রিন্ট করা