JavaRush /مدونة جافا /Random-AR /حل المسائل المتعلقة بالمصفوفات أحادية البعد وثنائية الأبع...
Анзор Кармов
مستوى
Санкт-Петербург

حل المسائل المتعلقة بالمصفوفات أحادية البعد وثنائية الأبعاد

نشرت في المجموعة
ستأخذ هذه المقالة بعين الاعتبار (وإلى حد كبير، ستوفر تحليلًا مستقلاً) للمشكلات التي تتضمن المصفوفات. سنقوم بتحسين مهاراتنا في المجالات التالية:
  1. مصفوفات أحادية البعد

    1. مشاكل "مواصلة التسلسل" ;
    2. مهام البحث عن العناصر؛
    3. المشاكل التي تنطوي على فرز عناصر المصفوفة.
  2. صفائف ثنائية الأبعاد

    1. المهام "إنشاء مصفوفة النموذج" ;
    2. المهام "البحث عن العناصر في أكثر الأماكن غير المتوقعة (الصفوف والأعمدة والأقطار)" ;
    3. المهام "ترتيب السفن لمعركة المياه " .
لجميع المسائل سوف نستخدم صفائف من الأعداد الصحيحة. حل المسائل المتعلقة بالمصفوفات أحادية البعد وثنائية الأبعاد - 1

المشاكل التي تنطوي على صفائف ذات بعد واحد

مواصلة التسلسل

في هذه السلسلة من المهام سوف تحتاج إلى:
  1. تحديد النمط الذي يتم من خلاله تشكيل هذا التسلسل العددي أو ذاك.
  2. اكتب دالة تشكل العناصر N الأولى من تسلسل معين كمصفوفة أعداد صحيحة وتعرض عناصر المصفوفة على الشاشة.
لنفترض أننا نواجه مهمة مواصلة سلسلة الأرقام التالية:

1, 2, 3, 4, 5…
الخطوة 1: تحديد النمط. كل شيء هنا أساسي، فهو عبارة عن سلسلة من الأعداد الطبيعية. الخطوة 2: اكتب دالة ستشكل العناصر N الأولى لصف معين على شكل مصفوفة:
public class Main {

    public static void main(String[] args) {
        System.out.println(Arrays.toString(createArrayOfIntegers(10)));

        // Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    }

    public static int[] createArrayOfIntegers(int n) {
        int[] array = new int[n];
        for (int i = 1; i <= n; i++) {
            array[i-1] = i;
        }

        return array;
    }
}
وبالمثل، من الضروري كتابة دوال من شأنها أن تستمر في التسلسل التالي:

A. 2,  4,  6,   8,  10...
B. 1,  3,  5,   7,   9...
C. 1,  4,  9,  16,  25...
D. 1,  8, 27,  64, 125...
E. 1, -1,  1,  -1,   1,  -1...
F. 1, -2,  3,  -4,   5,  -6...
G. 1, -4,  9, -16,  25....
H. 1,  0,  2,   0,   3,   0,  4....
I. 1,  2,  6,  24, 120, 720...
J. 1,  1,  2,   3,   5,   8, 13, 21…

البحث عن العناصر

في سلسلة المهام هذه، من الضروري العثور على عنصر في المصفوفة النهائية يحتوي على بعض الخصائص. على سبيل المثال، العنصر ذو القيمة القصوى. للتوضيح، دعونا نكتب رمزًا لدالة تأخذ مصفوفة وتحدد فهرس الحد الأقصى للعنصر في المصفوفة، ثم تقوم بإخراج هذا العنصر مع فهرسه إلى وحدة التحكم. سأوضح أيضًا كيف، باستخدام الفصل، java.util.concurrent.ThreadLocalRandomيمكنك بسرعة إنشاء مصفوفة أعداد صحيحة بطول معين، تتكون من عناصر عشوائية:
public class Main {

    public static void main(String[] args) {
        int[] array = generateRandomIntArray(10);
        findMax(array);

        /*
        Output:
        Generated random array: [50551934, -551646189, 410352642, 1822778873, -1744293692, -1140287711, 878876868, -2116893120, -797503442, -703924530]
        Max element is [1822778873] with index [3]
        */

    }


    public static int[] generateRandomIntArray(int n) {
        int[] array = ThreadLocalRandom.current().ints().limit(n).toArray();
        System.out.println("Generated random array: " + Arrays.toString(array));
        return array;
    }

    public static void findMax(int[] array) {
        int maxIndex = 0;
        int max = array[maxIndex];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
                maxIndex = i;
            }
        }

        System.out.println(String.format("Max element is [%d] with index [%d]", max, maxIndex));
    }
}
الآن المهام نفسها. من مجموعة من العناصر الصحيحة العشوائية نحتاج إلى إيجاد:
  1. أقصى.
  2. الحد الأدنى.
  3. متوسط.
  4. عدد العناصر بين الحد الأقصى والحد الأدنى للعناصر.
  5. العدد الأولي الأول.
  6. الرقم الأولي الأخير.
  7. عدد الأعداد الأولية في المصفوفة.
يمكنك عرض كل من القيمة والمؤشرات. إذا لم يكن هناك عنصر تبحث عنه، اعرضه على الشاشة حسب راحتك. بالنسبة للمهمة الأخيرة، تحتاج إلى إعداد مجموعة من العناصر الصحيحة مرتبة بترتيب تصاعدي. في هذه المصفوفة، تحتاج إلى العثور على عنصر حسب القيمة في أقل عدد من العمليات ( تلميح ).

فرز

في هذه السلسلة من المسائل، تحتاج إلى فرز مجموعة من العناصر الصحيحة باستخدام خوارزميات فرز مختلفة. هناك الكثير من المواد على الإنترنت حول خوارزميات مختلفة. حاول فهم جوهر الخوارزمية أولاً، ثم حاول تنفيذها بنفسك. أولاً على الورق (مخطط قالبي، كود زائف، أي شيء يناسبك)، ثم في IDEA. خوارزميات التنفيذ:
  • فقاعة الفرز؛
  • اختيار نوع؛
  • ترتيب بالإدراج؛
  • دمج النوع.

المشاكل التي تنطوي على صفائف ثنائية الأبعاد

ارسم مصفوفة

في السلسلة التالية من المهام، من الضروري رسم (الإخراج إلى وحدة التحكم) مصفوفات ثنائية الأبعاد (مصفوفات) مؤلفة بطريقة معينة: يجب أن تتوافق مع النمط المحدد بواسطة المهمة. اسمحوا لي أن أقدم لكم مثالا. نحتاج إلى بناء وعرض مصفوفة m*n(حيث mيوجد عدد الصفوف وعدد nالعناصر الموجودة في الصف) للنموذج:

1, 2, 3, 4
5, 6, 7, 8
9,10,11,12
لنكتب دالة من شأنها أن تفعل كل شيء من أجلنا، ونقدم أيضًا دالة ستخرج المصفوفة بشكل جميل إلى وحدة التحكم (قد تجدها مفيدة):
public class Main {

    public static void main(String[] args) {
        createAndDrawMatrix(3, 4);

    }

    public static void createAndDrawMatrix(int m, int n) {
        int[][] matrix = new int[m][n];

        int value = 1;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = value;
                value ++;
            }
        }

        printMatrix(matrix);
    }

    public static void printMatrix(int[][] matrix) {
        for (int[] array : matrix) {
            for (int anInt : array) {
                System.out.print(String.format("%3d", anInt));
            }
            System.out.println();
        }
    }
}
المهام الآن: عرض مصفوفة m*nالنموذج: 4, 3, 2, 1 8, 7, 6, 5, 12,11,10, 9 ----------- 1, 4, 7 2, 5, 8 3, 6, 9 ----------- 9, 8, 7 6, 5, 4 3, 2, 1 ----------- 12,11,10, 9 8, 7, 6, 5, 4, 3, 2, 1

البحث عن العناصر

من الضروري في هذا القسم إجراء بحث عن عناصر مختلفة في أجزاء مختلفة من المصفوفة: في عمود معين أو في صف معين. لنفترض أن لدينا مصفوفة بالشكل: -1 2 -3 4 -5 6 -7 8 -9 10 -11 12 -13 14 -15 16 -17 18 -19 20 -21 22 -23 24 -25 26 -27 28 -29 30 -31 32 -33 34 -35 على سبيل المثال، لنوجد عدد العناصر السالبة في الصف الثالث:
public class Main {

    public static void main(String[] args) {
        int [][] matrix = {
                { -1,   2,   -3,    4,   -5,    6,   -7},
                {  8,  -9,   10,  -11,   12,  -13,   14},
                {-15,  16,  -17,   18,  -19,   20,  -21},
                { 22, -23,   24,  -25,   26,  -27,   28},
                {-29,  30,  -31,   32,  -33,   34,  -35}
        };

        findNegativeCountInRow(matrix, 3);
    }

    private static void findNegativeCountInRow(int[][] matrix, int rowNumber) {
        int negativeCount = 0;
        for (int element : matrix[rowNumber]){
            if (element < 0) {
                negativeCount ++;
            }
        }

        System.out.println("Matrix: ");
        printMatrix(matrix);
        System.out.println(String.format("Has %d negative elements in #%d row ", negativeCount, rowNumber));

    }

    public static void printMatrix(int[][] matrix) {
        for (int[] array : matrix) {
            for (int anInt : array) {
                System.out.print(String.format("%5d", anInt));
            }
            System.out.println();
        }
    }
}
نتيجة لتنفيذ الطريقة الرئيسية، سيتم إخراج ما يلي إلى وحدة التحكم:

Matrix: 
   -1    2   -3    4   -5    6   -7
    8   -9   10  -11   12  -13   14
  -15   16  -17   18  -19   20  -21
   22  -23   24  -25   26  -27   28
  -29   30  -31   32  -33   34  -35
Has 3 negative elements in #3 row 
الآن المهام. لأي حالة فردية، nاطبع مصفوفة n*nمن النموذج:

1,  -2,  3,  
-4,  5, -6,
7,  -8,  9
من هذه المصفوفة استنتج:
  • جميع العناصر السلبية؛
  • جميع العناصر السلبية في السلسلة i؛
  • كافة العناصر السلبية في العمود j;
  • جميع العناصر القطرية (بدءا من الزاوية اليسرى العليا)؛
  • جميع العناصر القطرية (بدءًا من الزاوية اليسرى السفلية).

معركة بحرية

القسم الأخير بعلامة النجمة: لا توجد نصائح أو أمثلة. تعتبر المصفوفات مثالية لبرمجة لعبة المعركة البحرية. إحدى مراحل برمجة هذه اللعبة هي وضع السفن في الملعب. إذا تمكنت من حل عدد من هذه المشكلات، فتأكد من أنك ستتمكن من التعامل مع القتال البحري. لذلك، نظرا لمصفوفة 10x10 تتكون من الأصفار. لنفترض أنه ميدان للعب معركة بحرية. في هذا الحقل، 0 عبارة عن خلية فارغة، و1 عبارة عن سفينة أو جزء من سفينة. اكتب الوظائف، كل منها، وفقًا لقواعد لعبة المعركة البحرية، تضعها بشكل عشوائي:
  • 10 سفن ذات طابق واحد؛
  • 10 مرجانيات ذات طابقين؛
  • 5 سفن ذات ثلاثة طوابق؛
  • يرتب جميع السفن للعبة المعركة البحرية (4 ذات طابق واحد، 3 ذات طابقين، 2 ذات ثلاثة طوابق، 1 ذات أربعة طوابق).
هذا كل شئ! كما هو الحال مع أي موضوع برمجة، من الأفضل تعلم المصفوفات من خلال الممارسة. الاحماء سعيدة!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION