Задача 2
Задача 3
Задача 4
Задача 5
Здравейте,
Тези задачи с чертането са ми били винаги забавни.
Ето и впечатленията ми.
Условието на задачата може да изтеглите от тук: 4. Fire.doc
Когато имаме такива задачи предпочитам следния подход: Използвам 2 вложени цикъла за обхождане на правоъгълника в който изчертаваме от вида:
for (int y = 0; y < ySize; y++) { for (int x = 0; x < xSize; x++) { ... } ... }
Координатната система е малко различна от математическата, и разликата е в това че Y координатата се увеличава надолу за разлика от математиката, където е нагоре.
След това използвам един if за проверка на математическа формула на графика и се получава точното изчертаване. Например ако искаме да изчертаем:
x... .x.. ..x. ...xИзползвам следния код:
for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if(x == y) { Console.Write("x"); } else { Console.Write("."); } } Console.WriteLine(); }Аналогично за:
...x ..x. .x.. x...Се получава с:
for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if(x + y == 4 - 1) { Console.Write("x"); } else { Console.Write("."); } } Console.WriteLine(); }Умишлено написах 4 - 1 в проверката, понеже при динамични размери се получава точно по тази формула.
Горните 2 варианта се използват за чертане на прави или част от прави, и ги използвах при пламъците.
Има възможност да се изчертае и цяла област в страни от права. Например за:
...x ..xx .xxx xxxxСе използва следната проверка:
for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if(x + y >= 4 - 1) { Console.Write("x"); } else { Console.Write("."); } } Console.WriteLine(); }Този подход използвах при дръжката, като я разделих визуално на ляв правоъгълник и десен.
Където ключовите проверки са x < half и x >= half.
В този дух използвайки координатна система и формули си нарисувах факлата на 3 части.
1. Огъня горната му част.
2. Огъня долната част.
3. Линията с тиретата (тук използвах създаване на string от char и брой.
4. Дръжката
Ето и кода:
using System; class FireInTheMatrix { static void Main() { int n = int.Parse(Console.ReadLine()); int half = n / 2; int quoter = n / 4; for (int y = 0; y < half; y++) { for (int x = 0; x < n; x++) { if ((x + y == half - 1) || (x - half == y)) { Console.Write("#"); } else { Console.Write("."); } } Console.WriteLine(); } for (int y = 0; y < quoter; y++) { for (int x = 0; x < n; x++) { if ((x == y) || (x + y == n - 1)) { Console.Write("#"); } else { Console.Write("."); } } Console.WriteLine(); } Console.WriteLine(new string('-', n)); for (int y = 0; y < half; y++) { for (int x = 0; x < n; x++) { if (x >= y && x < half) { Console.Write("\\"); } else if (x + y < n && x >= half) { Console.Write("/"); } else { Console.Write("."); } } Console.WriteLine(); } } }
Няма коментари:
Публикуване на коментар