Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 5
1

Определить количество плиток попадающих внутрь круга

28.09.2016, 20:04. Показов 1402. Ответов 7
Метки нет (Все метки)

Лич Сандро проводит свои научные исследования в магии огня. Сандро стоит в центре огромного квадратного зала площадью миллион квадратных километров, сплошь замощённого квадратными каменными плитами со стороной один метр. По взмаху посоха вокруг Сандро возникает огненный круг радиуса R метров. Центр круга совпадает с центром зала и находится в месте соприкосновения четырёх плит. Сандро хочет посчитать, сколько плит будет испорчено огнем. Считается, что плита испорчена, если она имеет хотя бы две общие точки с кругом. На рисунке в качестве примера изображены плиты, испорченные огненным кругом радиуса 4:
В единственной строке записано целое число R > 0 — радиус огненного круга. R не превосходит 10^5.
Выведите целое число — количество испорченных плит.
Примеры:
исходные данные результат
2 16
4 60
Изображения
 
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2016, 20:04
Ответы с готовыми решениями:

Определить количество точек на плоскости, попадающих внутрь круга
собственно сабж. прошу помощи в решении. 1)Даны натуральное число k и вещественные массивы Х,...

Найти количество точек, попадающих внутрь каждого полукруга
Дан файл действительных чисел r1, r2,…,r11. Все они упорядочены по возрастанию. Эти числа...

Определить количество плиток, чтобы замостить пол
Для того, чтобы замостить пол прямоугольной комнаты размерами AxB мастера решили приобрести...

Определить количество способов укладки плиток на оставшиеся места
Задача G. Укладка плитки (Время: 1 сек. Память: 16 Мб Баллы: 100) В процессе ремонта в...

7
252 / 158 / 118
Регистрация: 26.11.2012
Сообщений: 384
29.09.2016, 09:11 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main(){
    
    int r = 4, c = 0;
    for(int x = r - 1; x >= 0 ; x--)
        for(int y = r - 1; y >= 0; y--)
          if(x*x + y*y > r*r) c++;
          else break;
   std::cout << (r * 2)*(r * 2) - c * 4;
   return 0;
}
0
Эксперт С++
3211 / 1738 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.09.2016, 17:55 3
Apostol584, ну, во-первых, неправильно.
В строке 8 нужно поставить
C++
1
if(x*x + y*y >= r*r) c++;
Во вторых, по условию
Цитата Сообщение от Alex19606436636 Посмотреть сообщение
R не превосходит 10^5.
, а это в int не влезет.
Но даже если заменить int на больший тип, по этому алгоритму для R = 10^5 считает около 10 секунд.
На самом деле вот так нужно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//Лич Сандро проводит свои научные исследования в магии огня. Сандро стоит
//в центре огромного квадратного зала площадью миллион квадратных километров,
//сплошь замощённого квадратными каменными плитами со стороной один метр.
//По взмаху посоха вокруг Сандро возникает огненный круг радиуса R метров.
//Центр круга совпадает с центром зала и находится в месте соприкосновения
//четырёх плит. Сандро хочет посчитать, сколько плит будет испорчено огнем.
//Считается, что плита испорчена, если она имеет хотя бы две общие точки
//с кругом. На рисунке в качестве примера изображены плиты, испорченные
//огненным кругом радиуса 4:
//В единственной строке записано целое число R > 0 — радиус огненного круга.
//R не превосходит 10^5.
//Выведите целое число — количество испорченных плит.
//Примеры:
//исходные данные результат
//2 16
//4 60
///////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iostream>
///////////////////////////////////////////////////////////////////////////////
typedef long long       T_int;
typedef long double     T_float;
///////////////////////////////////////////////////////////////////////////////
T_float     side_for_hyp_and_side
    (
        T_float     hyp,
        T_float     side
    )
{
    return  std::sqrt( hyp * hyp - side * side );
}
///////////////////////////////////////////////////////////////////////////////
T_int   dalles_count( T_int     r )
{
    T_int   sum_free{};
 
    for( T_int  k{1}; ; ++k )
    {
        auto        big_side    =   r - k;
 
        T_float     side        =   side_for_hyp_and_side
                                        (
                                            r,
                                            big_side
                                        );
 
        if  (
                    side
                >   big_side
            )
        {
            break;
        }
 
        T_int   term    =       big_side
                            -   std::ceil( side );
 
        sum_free        +=  term * 2 + 1;
    }//for
 
    return  ( r * r - sum_free ) * 4;
}
///////////////////////////////////////////////////////////////////////////////
int main()
{
    for(;;)
    {
        T_int   r{};
        std::cout   <<  "r = ";
        std::cin    >>  r;
 
        std::cout   <<  dalles_count(r)
                    <<  std::endl
                    <<  std::endl;
    }//for
}
2
Любитель чаепитий
3675 / 1750 / 544
Регистрация: 24.08.2014
Сообщений: 5,896
Записей в блоге: 1
29.09.2016, 18:13 4
Цитата Сообщение от Mr.X Посмотреть сообщение
а это в int не влезет.
10^5 = 100000, если не ошибаюсь, это в int влезет.
0
Эксперт С++
3211 / 1738 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.09.2016, 18:33 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
10^5 = 100000, если не ошибаюсь, это в int влезет.
А это:
Цитата Сообщение от Apostol584 Посмотреть сообщение
(r * 2)*(r * 2)
?
0
Любитель чаепитий
3675 / 1750 / 544
Регистрация: 24.08.2014
Сообщений: 5,896
Записей в блоге: 1
29.09.2016, 18:37 6
Цитата Сообщение от Mr.X Посмотреть сообщение
А это:
А это нет, я просто код Apostol584 не посмотрел внимательно.
0
Эксперт С++
3211 / 1738 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.09.2016, 18:40 7
Цитата Сообщение от GbaLog- Посмотреть сообщение
А это нет, я просто код Apostol584 не посмотрел внимательно.
Тогда смело запускайте мою программу, она вам покажет результат!
0
GbaLog-
29.09.2016, 18:42     Определить количество плиток попадающих внутрь круга
  #8

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
Тогда смело запускайте мою программу, она вам покажет!
Сначала вот так прочитал. :D

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2016, 18:42

Определить количество плиток замащенных внутрь круга
Лич Сандро проводит свои научные исследования в магии огня. Сандро стоит в центре огромного...

Определить количество точек, попадающих внутрь верхней части круга
Определить количество точек, попадающих внутрь верхней части круга радиусом R=4 и с центром в...

Определить количество точек, попавших внутрь верхней части круга
Определить количество точек, попавших внутрь верхней части круга радиусом R = 4 и с центром в...

Найти количество точек, попадающих внутрь каждого полукруга
вводятся координаты точек x и y, раидус окружности r. Найти количество точек, попадающих внутрь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru