هذه مسألة رأيتها على فيسبوك:
من الممكن كتابة برنامج لحل هذه
المسألة، مع ملاحظة أنها يمكن أن تنقسم إلى مسألتين: فالمربعان الداخليان الصغيران
متماثلان، ويمكن إخراجهما خارج الشكل، مع الحفاظ على الخطين المتقاطعين داخل كل
منهما.
فيتبقى المربع الخارجي الكبير بتقسيماته
الداخلية.
لحساب عدد المربعات داخل أي شكل
lمثل هذا برمجيا، يمكن كتابة حلقتي تكرار متداخلتين Nested
For Loops،
لحساب عدد المربعات التي يمكن إنشاؤها عند كل نقطة، في اتجاه اليسار والأسفل..
ووضع هذا الكود في دالة لها معامل يمثل عدد المربعات في كل صف، لاستدعاء هذه
الدالة أكثر من مرة لحل أي مسالة من هذا النوع.. هنا مثلا سنستدعيها مرتين، الأولى
بقيمة المعامل 2 لحل المربع الصغير، والثانية بقيمة المعامل 4 لحل المربع الكبير..
فكروا فيها واكتبوا البرنامج. سيكون سهلا جدا.
ولتسهيل حل المسألة كتبت لكم في كل
مربع عدد المربعات التي يمكن إنشاؤها من رأسه العلوية اليسرى في اتجاه اليمين
والأسفل:
هناك نمط واضح يمكنكم ملاحظته
(لونته ليسهل عليكم رؤيته) وهو قابل للتعميم.. المطلوب كتابة دالة Function عامة تستقبل عدد الصفوف R والأعمدة C
المطلوب تقسيم المستطيل إليها (ليس شرطا أن يكون مربعا)، وفي كود هذه الدالة
تقومون بتعريف مصفوفة ثنائية البعد 2-Dimensional Array لها نفس عدد الصفوف والأعمدة A(R, C)،
وكتابة حلقتي تكرار متداخلتين Nested For
Loops
لملء خاناتها بالأرقام بالنمط الموضح في الشكل.. سيكون عدد المربعات الممكنة هو
مجموع الأرقام المكتوبة في هذه الخانات.
ملحوظة 1:
ليست هناك حاجة حقيقية للمصفوفة،
لكنها لتسهيل الشرح.. يمكن جمع الأرقام مباشرة داخل حلقتي التكرار، ما دام المطلوب
فقط هو المجموع.
ملحوظة 2:
أسهل طريقة هي ملء المصفوفة بطريقة
معكوسة بدءا بالخانة التي تحوي العدد 1 في أقصى اليمين في الصف الأخير.. يمكن فعل
هذا باستخدام حلقتي تكرار معكوستين يتناقص عداداهما، أو ببساطة، يمكنك أن تعكس
الرسمة نفسها، بحيث تضع الرقم 1 في الصف الأول والعمود الأول، والرقم 2 في الخانات
الفارغة في الصف الثاني والعمود الثاني وهكذا... احتجت فقط لرسم المربع معكوسا لأن
فهم المسألة يكون أوضح هكذا، لكن ملء المصفوفة برمجيا سيكون أسهل بالطريقة الأخرى!..
ساعتها استخدام هذا الشرط:
إذا كان رقم العمود الحالي أصغر من
رقم الصف الحالي إذن:
قيمة
الخانة = رقم العمود.
غير هذا:
قيمة
الخانة = رقم الصف.
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.