понеделник, 24 юни 2013 г.

C# програмиране - част I - Problem 4 – Fire in the Matrix - Изпит на 23.06.2013

Задача 1
Задача 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();
        }
    }
}


Няма коментари:

Публикуване на коментар