Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

พิมพ์ n x n spiral matrix โดยใช้ O(1) ช่องว่างพิเศษในโปรแกรม C


เราได้รับจำนวนเต็มบวก n และสร้างเมทริกซ์เกลียวของ n x n โดยใช้ช่องว่างพิเศษ O(1) ในทิศทางตามเข็มนาฬิกาเท่านั้น

เมทริกซ์เกลียวเป็นเมทริกซ์ที่ทำงานเหมือนเกลียวซึ่งจะเริ่มต้นจากจุดกำเนิดของวงกลมและหมุนตามเข็มนาฬิกา งานคือพิมพ์เมทริกซ์ในรูปแบบเกลียวโดยใช้ช่องว่าง O(1) โดยเริ่มจาก 2 → 4 → 6 → 8 → 10 → 12 → 14 → 1 6 → 18

ด้านล่างเป็นตัวอย่างของเมทริกซ์เกลียว -

พิมพ์ n x n spiral matrix โดยใช้ O(1) ช่องว่างพิเศษในโปรแกรม C

ตัวอย่าง

Input: 3
Output:
   9 8 7
   2 1 6
   3 4 1

มันกลายเป็นเรื่องง่ายในการแก้โค้ดที่มีพื้นที่ไม่จำกัดแต่นั้นไม่ได้มีประสิทธิภาพเท่ากับโปรแกรมที่ดีที่สุดหรือโค้ดนั้นมีประสิทธิภาพในหน่วยความจำและเวลาทั้งคู่ ดังนั้นเพื่อรักษาลำดับเกลียวจึงใช้สี่ลูปซึ่งแต่ละอันสำหรับมุมบน ขวา ล่าง และซ้ายของเมทริกซ์ แต่ถ้าเราแบ่งเมทริกซ์ออกเป็นสองส่วน คือ บนขวาและล่างซ้าย เราจะสามารถใช้แนวคิดได้โดยตรง

สำหรับครึ่งบนขวา

mat[i][j] = (n-2*x)*(n-2*x)-(i-x)-(j-x)

สำหรับครึ่งล่างซ้าย

mat[i][j] = (n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)

หมายเหตุ - เรากำลังเขียนโปรแกรมสำหรับพิมพ์ผลคูณเมทริกซ์ของ 2

อัลกอริทึม

int spiralmatrix(int n)
START
STEP 1: DECLARE i, j, a, b, x
STEP 2: LOOP FOR i = 0 AND i < n AND i++
   LOOP FOR j = 0 AND j < n AND j++
      FIND THE MINIMUM IN (i<j ) AND ASSIGN IT TO a
      FIND THE MINIMUM (n-1-i) < (n-1-j) AND ASSIGN IT TO b
      THEN ASSIGN THE LEAST VALUE FROM a AND b TO x
      IF i <= j THEN,
         PRINT THE VALUE OF 2* ((n-2*x)*(n-2*x) - (i-x) - (j-x))
      ELSE
         PRINT THE VALUE OF 2*((n-2*x-2)*(n-2*x2) + (i-x) + (j-x))
   END LOOP
   PRINT NEWLINE
END LOOP
STOP

ตัวอย่าง

#include <stdio.h>
//For n x n spiral matrix
int spiralmatrix(int n){
   int i, j, a, b, x; // x stores the layer in which (i, j)th element exist
   for ( i = 0; i < n; i++){
      for ( j = 0; j < n; j++){
         // Finds minimum of four inputs
         a = ((i<j ? i : j));
         b = ((n-1-i) < (n-1-j) ? (n-1-i) : (n-1-j));
         x = a < b ? a : b;
         // For upper right half
         if (i <= j)
            printf("%d\t ", 2 * ((n-2*x)*(n-2*x) - (i-x) - (j-x)));
            // for lower left half
         else
            printf("%d\t ", 2*((n-2*x-2)*(n-2*x-2) + (i-x) + (j-x)));
      }
      printf("\n");
   }
}
int main(int argc, char const *argv[]){
   int n = 3;
   spiralmatrix(n);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โปรแกรมด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้ -

18 16 14
4 2 12
6 8 10