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.
-
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)
.
- Shahzoda va malikaning koordinatalari:
- Birinchi qator:
-
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:
- Test sonini olish: Avval kiritilgan testlar sonini olamiz.
- Koordinatalarni o'qish: Har bir test uchun shahzoda va malikaning joylashuvlarini olamiz.
- 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.
- 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;
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]);
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(int x, int y)
{
public readonly X { get; init; }=x;
public readonly Y { get; init; }=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; }
public Planet(string? input)
{
var parts = input?.Split(' ', StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray() ?? [];
Center = new Point(parts[0], parts[1]);
R = parts[2];
}
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.
Top comments (0)