Kichik Shahzoda(C#) solution.

Kichik Shahzoda(C#) solution.


Muammoning Qo’ylishi:

Shahzoda va malika bir-birlari bilan uchrashishni rejalashtirganlar, ammo ular orasidagi yo’lda bir nechta planetalar joylashgan. Ular uchrashish uchun planetalardan o’tishlari kerak. Har bir planetaning radiusi va markazi mavjud bo’lib, shahzoda va malikaning oldiga borishi uchun kamida nechta sayyorani kesib o’tishi kerakligini aniqlashimiz kerak.

Bizning maqsadimiz:

  • Shahzoda va malikaning joylashuvlari berilgan.
  • Sayyoralar to’g’risida ma’lumotlar berilgan.
  • Har bir planetani tekshirish kerak: agar shahzoda va malika faqat bitta sayyoradan o’tayotgan bo’lsa, ya’ni biri ichida va ikkinchisi tashqarisida bo’lsa,shahzoda o’sha planetani kesib o’tishga majbur bo’ladi.
  1. Input:

    • Birinchi qator: testCases — testlar soni.
    • Keyingi qatorlar har bir test uchun:
      • Shahzoda va malikaning koordinatalari: (x1, y1, x2, y2).
      • Kesib o’tishi mukin bo’lgan sayyoralar soni: crossCount.
      • Keyingi satrlarda har bir sayyoraning markazi va radiusi: (cx, cy, r).
  2. Otput:

    • Har bir testda shahzoda necha marta planetadan kesib o’tganligini chop etish.

Masalan:

Input:

1
0 0 10 10
2
5 5 5
15 15 3

Chiqish:

1
  • Shahzoda (0, 0) va malika (10, 10) joylashuvda.
  • Birinchi planetaning markazi (5, 5) va radiusi 5, bu sayyora orqali shahzoda yoki malika o‘tmagan.
  • Ikkinchi planetaning markazi (15, 15) va radiusi 3, lekin bu planetadan kesib o‘tganlar soni 1, chunki faqat bitta marta planetadan o‘tiladi.

Yondashuv:

  1. Test sonini olish: Avval kiritilgan testlar sonini olamiz.
  2. Koordinatalarni o’qish: Har bir test uchun shahzoda va malikaning joylashuvlarini olamiz.
  3. Planetani tekshirish: Har bir sayyora uchun tekshirish qilamiz: shahzoda yoki malikaning planetada joylashganligini aniqlaymiz. Agar faqat bittasi ichida bo’lsa, u holda kesish holati hisoblanadi.
  4. Natijani chiqarish: Har bir test uchun nechta kesish sodir bo’lganligini chiqaramiz.

Fayllarga Ajratilgan Kod:

1. Program.cs (Asosiy boshqaruv fayli)

using DotNetBootcamp.Day3;

class Program
{
    static void Main()
    {
        int testCases;
        int.TryParse(Console.ReadLine(), out testCases);

        while (testCases-- > 0)
        {
            var crosses = 0;

            // Shahzoda va malikaning koordinatalarini olish
            var address = Console.ReadLine()?
                .Split(' ', StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse)
                .ToArray() ?? [];

            var prince = new Point(address[0], address[1]);
            var princess = new Point(address[2], address[3]);

            // Kesishlar sonini hisoblash
            int crossCount;
            int.TryParse(Console.ReadLine(), out crossCount);

            while (crossCount-- > 0)
            {
                var planet = new Planet(Console.ReadLine());
                var Ischecked = planet.Contains(prince) ^ planet.Contains(princess);
                crosses += Ischecked ? 1 : 0;
            }

            // Natijani chiqarish
            Console.WriteLine(crosses);
        }
    }
}

Tushuntirish:

  • testCases: Foydalanuvchi testlar sonini kiritadi.
  • address: Shahzoda va malikaning koordinatalari o’qiladi va ular Point strukturasiga joylashtiriladi.
  • crossCount: Kesib o’tish kerak bo’lgan sayyoralar soni o’qiladi.
  • Planet obyekti har bir planetani tekshirish uchun ishlatiladi va Contains() metodi orqali shahzoda yoki malika planetaning ichida ekanligini tekshiramiz.
  • crosses orqali kesishlar soni saqlanadi va testlar soni bo’yicha chiqariladi.

2. Point.cs (Shahzoda va malikaning koordinatalarini saqlovchi nuqta)

namespace DotNetBootcamp.Day3;

public readonly struct Point
{
    public int X { get; init; }
    public int Y { get; init; }

    // Constructor to initialize point
    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

Tushuntirish:

Point strukturasida joylashuv nuqtalari (x, y) saqlanadi.

Constructor har bir Point obyektini yaratishda koordinatalarni qabul qiladi.

3. Planet.cs (Planetani aniqlovchi va uning markazi va radiusini saqlovchi struktura)

namespace DotNetBootcamp.Day3;

public readonly struct Planet
{
    public Point Center { get; init; }
    public int R { get; init; }

    // Constructor to initialize planet from input string
    public Planet(string? input)
    {
        var parts = input?.Split(' ', StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToArray() ?? [];

        Center = new Point(parts[0], parts[1]);
        R = parts[2];
    }

    // Method to check if a point is inside the planet
    public bool Contains(Point point)
    {
        var a = point.X - Center.X;
        var b = point.Y - Center.Y;
        var distanceSquared = a * a + b * b;
        return distanceSquared <= R * R;
    }
}

Tushuntirish:

  • Planet strukturasida markaz (Point) va radius (R) saqlanadi.
  • Constructor: String ko’rinishida kiritilgan ma’lumotlardan markaz va radius olinadi.
  • Contains metodi: Berilgan nuqta planetaning ichida yoki tashqarisida joylashganligini aniqlaydi.

Xulosa:

Bu yondashuvda biz shahzoda va malika orasidagi kesishlar sonini topish uchun:

  • Har bir test case uchun kiritilgan koordinatalar va sayyoralarni tahlil qildik.
  • Planetani tekshirish va nuqtalar orasidagi masofani hisoblash uchun Pifagor teoremasidan foydalandik.
  • Har bir test uchun nechta kesish holati borligini hisoblab ekranga chop etdik.



Source link
lol

By stp2y

Leave a Reply

Your email address will not be published. Required fields are marked *

No widgets found. Go to Widget page and add the widget in Offcanvas Sidebar Widget Area.