Beautiful Matrix
عند إعطائك مصفوفة بحجم \(5 \times 5\) تحتوي على \(24\) صفراً وواحد فقط من القيمة \(1\)، تكون مهمتك هي إيجاد أقل عدد من الحركات المطلوبة لوضع العدد \(1\) في مركز المصفوفة.
الحركات المسموح بها هي تبديل موقع خليتين متجاورتين عموديًا أو أفقيًا.
Solution
إن التحركات العمودية والأفقية مستقلة عن بعضها، لذلك يمكن التفكير في كل واحدة على حدة. إذا قمنا بترقيم الصفوف من \(1\) إلى \(5\)، فإن الصف الأوسط هو الصف رقم \(3\). لنفترض أن العدد \(1\) موجود حاليًا في الصف رقم \(r\). كل حركة عمودية تغيّر موقعه بمقدار صف واحد، لذا سيحتاج إلى \(|r - 3|\) حركة للوصول إلى الصف الأوسط.
وبالطريقة نفسها، إذا قمنا بترقيم الأعمدة من \(1\) إلى \(5\)، فإن العمود الأوسط هو العمود رقم \(3\). وإذا كان العدد \(1\) في العمود رقم \(c\)، فسيحتاج إلى \(|c - 3|\) حركة للوصول إلى العمود الأوسط.
بجمع هاتين القيمتين نحصل على العدد الكلي للحركات المطلوبة: \(|r - 3| + |c - 3|\)
#include<iostream>
using namespace std;
int abs_val(int v) {
return (v > 0 ? v : -v); // عامل شرطي يعيد القيمة الموجبة دائمًا
}
int main () {
int r, c;
for (int i = 1 ; i <= 5 ; i++) {
for (int j = 1 ; j <= 5 ; j++) {
int x;
cin >> x;
if (x == 1) {
r = i;
c = j;
}
}
}
cout << abs_val(r - 3) + abs_val(c - 3);
}