Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Подскажите по алгоритму. Код писать не надо  (Прочитано 638 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн nextdrift

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
Вот задание:
На плоскости задано множество точек. Выбрать две различные точки так, чтобы окружности заданного радиуса с центрами в этих точках содержали внутри себя одинаковое количество точек.


Что-то я не пойму, как определить, что точка лежит в окружности...
 >:( :)

Оффлайн solint

  • Активист
  • *
  • Сообщений: 673
    • Просмотр профиля
Расстояние от точки до точки должно быть меньше радиуса окружности

Оффлайн nextdrift

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
Точно :) Вроде въехал... Спасибо :)  :) :)

И так, чтобы проверить свои мысли, как найти это расстояние :)

Через гипотенузу ведь? Т.е. найти разности по модулю между X и Y этих точек. Затем найти гипотенузу - это и будет расстояние.

Правильно?

И вот ещё вопрос... Я делаю это в C#. Лучше использовать double или int? для координат и всего вычисления

Пользователь решил продолжить мысль 27 Март 2012, 14:53:20:
Решил задачу :) может кому-то пригодится решение

//На плоскости задано множество точек.
//Выбрать две различные точки так, чтобы окружности заданного радиуса с центрами
//в этих точках содержали внутри себя одинаковое количество точек.
//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LB1_27
{
    class Program
    {
        static void Main(string[] args)
        {
            // тестовые данные
            double[] x = { 1.0, 234.0, 80.0, 19.0};
            double[] y = { 18.0, 22.0, 97.0, 7.0 };
            double radius = 33.0;

            int[] countPoint = new int[x.Length];

            for (int i1 = 0; i1 < x.Length; i1++)
            {
                for (int i2 = 0; i2 < x.Length; i2++)
                {
                    if (i2 != i1) // заглушка, чтобы себя не проверяла точка
                    {
                        double lenX = Math.Abs(x[i1] - x[i2]);
                        double lenY = Math.Abs(y[i1] - y[i2]);
                        double len = Math.Sqrt(lenX*lenX + lenY*lenY);

                        // если растояние входит в пределы радиуса, то увеличиваем счётчик
                        if (len <= radius)
                        {
                            countPoint[i1]++;
                        }
                    }
                }
            }

            // выбираем по 2 точки, в радиусе которых одинаковое количество точек
            for (int i1 = 0; i1 < countPoint.Length; i1++)
            {
                for (int i2 = 0; i2 < countPoint.Length; i2++)
                {
                    if (i1 != i2)
                    {
                        if (countPoint[i1] !=0 && countPoint[i1] == countPoint[i2])
                        {
                            Console.WriteLine("Окружности {0} и {1}, кол-во точек = {2}", i1, i2, countPoint[i1]);
                        }

                    }
                }
            }
        }
    }
}
« Последнее редактирование: 27 Март 2012, 14:53:20 от nextdrift »

 

Страница сгенерирована за 0.064 секунд. Запросов: 25.