Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2018, 15:20   #1
Mark0111
Новичок
Джуниор
 
Регистрация: 31.10.2018
Сообщений: 1
По умолчанию [C#] Определить количество плиток замощенных внутрь круга

Лич Сандро проводит свои научные исследования в магии огня. Сандро стоит в центре огромного квадратного зала площадью миллион квадратных километров, сплошь замощённого квадратными каменными плитами со стороной один метр. По взмаху посоха вокруг Сандро возникает огненный круг радиуса R метров. Центр круга совпадает с центром зала и находится в месте соприкосновения четырёх плит. Сандро хочет посчитать, сколько плит будет испорчено огнем. Считается, что плита испорчена, если она имеет хотя бы две общие точки с кругом. На рисунке в качестве примера изображены плиты, испорченные огненным кругом радиуса 4:
В единственной строке записано целое число R > 0 — радиус огненного круга. R не превосходит 10^5.
Выведите целое число — количество испорченных плит.
Примеры:
исходные данные результат
2 16
4 60

Исходные данные
В единственной строке записано целое число R > 0 — радиус огненного круга. R не превосходит 10^5.
Результат
Выведите целое число — количество испорченных плит.
d73713f2-1dbb-4c86-9246-fbd4a16a6f14.png
По этому вопросу уже создавались темы, но они были на других языках программирования. А мне нужно на C#.
Мой код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _123
{
    class Program
    {
        static void Main(string[] args)
        {
            var radius = long.Parse(Console.ReadLine());
            long counter = 0;
            long radiusInTheSquare = radius * radius;
            double katet = radius * Math.Sin(45 * Math.PI / 180);
            for (long x = 0; x < katet; x++)
            {
                var tmp = radiusInTheSquare - x * x;
                for (long y = radius - 1; y >= 0; y--)
                {
                    if (y * y < tmp)
                    {
                        counter += (y + 1 - x) * 2 - 1;
                        break;
                    }
                }
            }
            Console.WriteLine(counter * 4);
        }
    }
}
Я ищу по вертикали вверху квадрат от левого нижнего угла которого расстояние до центра окружности меньше радиуса, если нахожу то беру его и еще все квадраты которые находятся под ним и еще умножаю на два, т.к по горизонтали картина та же.
Без-имени-21.jpg

Код выдает правильный результат, но при больших числах очень долго работает. А у меня лимит в 1с. Помогите улучшить код пожалуйста!!!
Mark0111 вне форума Ответить с цитированием
Старый 31.10.2018, 16:03   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
for (long y = radius - 1; y >= 0; y--)
                {
                    if (y * y < tmp)
≈ counter +=SQRT(tmp); // корень из данного округленный до целого
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 31.10.2018, 16:08   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на timus.ru в обсуждениях задачи приведён такой код (с) ace:
Код:
#include<iostream>
using namespace std;
int main()
{
  __int64 x,y=0,z=0,q,p,r;
  cin>>r;
  x=r;
  q=r*r;
 while(y<r)
 {
   p=q-y*y;
    while( x*x >= p && x >= 0 )--x;
   z+=(x+1);
   y++;
 }
  z*=4;
  cout<<z;
  system("pause");
return 0;
}
думаю, что он решает вашу проблему...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.10.2018, 22:42   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Посмотрите в сторону алгоритма Брезенхэма для окружности
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс, описывающий квадрат. Определить радиус круга, описанного вокруг квадрата. Kirillgr Помощь студентам 0 18.05.2014 23:38
Определить радиус наименьшего круга St@ter Помощь студентам 4 09.12.2012 13:56
С++ Задача(Определить количество отрицательных элементов, количество элементов в интервале от 1 до 5) grosssmile Помощь студентам 0 29.09.2012 18:25
определить количество четных чисел и количество нечетных чисел массива, которые вводятся в МЕМО, вывести в поле компонента Edit. Pyxy Помощь студентам 2 21.03.2012 23:24
Программа должна вычислять количество точек на границе круга heny Помощь студентам 9 05.03.2010 11:32