تدوير مصفوفة ثنائية الأبعاد
درس 7 من 11
7تدوير مصفوفة ثنائية الأبعاد
الصورة الكبيرةكل مسألة شبكة تبدأ بسؤال: لو أمسكت عنصرًا واحدًا، أين يذهب؟ اكتب الإحداثيات قبل وبعد لأمثلة صغيرة، وستظهر القاعدة، ثم يصبح الكود ترجمة لها.
ماذا تشاهد في الرسم: خطوتان بسيطتان تعطيان الدوران: المنقول يقلب الشبكة حول القطر، والعكس يكمل الربع دورة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
خذ صورة مربعة مطبوعة وأدرها ربع دورة مع عقارب الساعة. الصف العلوي يصبح العمود الأيمن، والعمود الأيسر يصبح الصف العلوي. البرنامج يفعل نفس الشيء خانة خانة، ونحتاج فقط قاعدة تقول أين تذهب كل خانة.
للدوران مع عقارب الساعة: new[c][n-1-r] = old[r][c]. بنسخة جديدة الحل O(n²) زمنًا وذاكرة. في المكان: المنقول يبدّل m[r][c] مع m[c][r] للخانات فوق القطر فقط، ثم row.reverse() لكل صف، فيصبح الحل O(n²) زمنًا وO(1) ذاكرة إضافية. بديل آخر: تدوير الحلقات من الخارج للداخل بأربع خانات في كل مرة.
قبل أن تبدأ
🐍القوائم المتداخلة
تعرف m[r][c] والحلقات المتداخلة.
الفكرة الجوهرية
1اشتق القاعدة من مثال
في شبكة 3×3، الرقم 1 في (0,0) ينتقل إلى (0,2)، والرقم 2 في (0,1) ينتقل إلى (1,2). الصف القديم صار العمود، والعمود القديم صار n-1-الصف.
def rotated_copy(m):
n = len(m)
out = [[None] * n for _ in range(n)]
for r in range(n):
for c in range(n):
out[c][n - 1 - r] = m[r][c]
return out
grid = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
for row in rotated_copy(grid):
print(row)2المنقول ثم العكس
المنقول يقلب الشبكة حول القطر الرئيسي. لو طبّقته ثم عكست كل صف تحصل على نفس النتيجة. جرّب الخطوتين منفصلتين لترى كل واحدة:
grid = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
transposed = [list(col) for col in zip(*grid)]
print("transpose:", transposed)
turned = [row[::-1] for row in transposed]
print("reversed rows:", turned)c > r.3تمرين: في المكان
المطلوب الشائع في المقابلات: عدّل نفس القائمة دون إنشاء شبكة جديدة. استخدم المنقول داخل المكان بتبديل m[r][c], m[c][r] للخانات فوق القطر، ثم reverse() لكل صف. تأكّد بالاختبار: الدوران أربع مرات يعيد الشبكة الأصلية.
مثال محلول
المسألة: صورة 2×2 [[1,2],[3,4]]. التحليل: المنقول [[1,3],[2,4]]، ثم عكس كل صف [[3,1],[4,2]]. التحقّق: الرقم 1 كان في الزاوية العليا اليسرى وصار في العليا اليمنى، وهذا ربع دورة مع عقارب الساعة.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| تحتاج شبكة جديدة دائمًا. | المنقول والعكس يعملان في المكان بذاكرة إضافية ثابتة. |
| الحل يعمل لأي مستطيل. | الدوران في المكان للمربع فقط. المستطيل m×n يصبح n×m فيحتاج شبكة جديدة. |
أين تقابله في العمل
🖼️معالجة الصور
تدوير الصور وتصحيح اتجاه الكاميرا.
🎮الألعاب
تدوير القطع في ألعاب الألغاز والشبكات.
اختبر فهمك
في دوران 90° مع عقارب الساعة لشبكة n×n، أين يذهب (r, c)؟
الصف يصبح العمود، والعمود القديم يصبح n-1-الصف.
لماذا نمرّ على c > r فقط في المنقول داخل المكان؟
التبديل المزدوج يلغي نفسه فتعود الشبكة كما هي.
ما تعقيد الذاكرة الإضافية للحل داخل المكان؟
نبدّل خانات فقط دون شبكة جديدة.
بطاقات مراجعة سريعة
تحقق من فهمك
كيف تدوّر عكس عقارب الساعة؟
المنقول ثم اعكس ترتيب الصفوف (لا محتواها).
هل يعمل الحل على شبكة 1×1؟
نعم، المنقول والعكس لا يغيّران شيئًا.
ما الزمن؟
O(n²) لأن كل خانة تُلمس مرة أو مرتين.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.