2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Построить треугольник по заданным условиям (на С++)
Сообщение01.04.2014, 15:00 
Аватара пользователя


01/04/14
1
Здравствуйте.
Помогите, пожалуйста, найти ошибки в программе.
Условие:
На вход подаётся шесть точек. Нужно вычислить расположение треугольника и вывести координаты его вершин исходя из условий:
1) вершинами треугольника должны быть три точки из полученных на вход,
2) треугольник должен располагаться так, чтобы внутри него оказалось как можно больше точек из оставшихся (не попавших в вершины).
Ответом должны быть три точки - вершины полученного треугольника.
Для написания программы использовать язык С++.

Программа написана, но работает некорректно: она выдает 3 точки, 2 из которых одинаковые, чаще всего это точки с индексами 3 и 4 из исходного массива. Т.е. вместо треугольника получается отрезок.
Алгоритм такой:
На точках строим всевозможные треугольники. Проверяем для них условия, запоминаем результаты. Затем сравниваем в каком случае условие было выполнено наилучшим образом, т.е когда внутри оказалось больше всего точек и выводим координаты вершин, удовлетворяющие этому условию.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdafx.h>
#define N 6
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main()
{
        //ввод точек
        int R[N][2];
        int i,j,k;
       
        cout<<"VVedite tochki\n";
        for(i=0;i<N;i++)
        {
                cout<<"x"<<"["<<i<<"]=";
                cin>>R[i][0];
                //cout<<"x"<<"["<<i<<"]="<<R[i][0]<<"\n";

                cout<<"y"<<"["<<i<<"]=";
                cin>>R[i][1];
                //cout<<"x"<<"["<<i<<"]="<<R[i][1]<<"\n";
                cout<<"\n";
        }

        for(j=0;j<N;j++)
        {
                cout<<"x"<<"["<<j<<"]="<<R[j][0]<<"\n";
                cout<<"y"<<"["<<j<<"]="<<R[j][1]<<"\n";
                cout<<"\n";
        }

        double a,b,c,p,S,S1,S2,S3,S4;
        double t,t1,t2,h1,p1,rad,g1;
        double a1,b1,c1,p2,p3;
        int F[3][2]; //для фиксации точек
        int n,m,n1,m1;//n-внешние точки m-внутренние точки
        h1=1;
        //n1=0;
        //m1=-1;
       
        int l,fuct,g;
        int e=5;

        fuct=0;
        for(i=0;i<3;i++)
        {
                F[i][0]=0;
                F[i][1]=0;
        }
        S4=0;

        for(i=0;i<N-1;i++)
        {
                //cout<<"x"<<"["<<i<<"]="<<R[i][0]<<"\n";
                //cout<<"y"<<"["<<i<<"]="<<R[i][1]<<"\n";
                for(j=0;j<N-1;j++)
                {
                        fuct=1;
                        g1=0;
                        if(j!=i)
                        {
                                for(l=0;l<N-1;l++)
                                {
                                        //if (fuct=1)
                                        //{
                                        if(j!=l || F[i][0]!=F[j][0] && F[l][0]!=F[i][0] || F[i][1]!=F[j][1] && F[l][1]!=F[i][1] )
                                        {
                                                if (fuct=1)
                                        {
                                                //длина стороны 1
                                                        t1=abs(R[i][0]-R[j][0]);
                                                        t2=abs(R[i][1]-R[j][1]);
                                                        t=t1*t1+t2*t2;
                                                        //a=sqrt(t);
                                                        a=pow(t,0.5);

                                                //длина стороны 2
                                                        t1=abs(R[i][0]-R[l][0]);
                                                        t2=abs(R[i][1]-R[l][1]);
                                                        t=t1*t1+t2*t2;
                                                        //b=sqrt(t);
                                                        b=pow(t,0.5);

                                                //длина стороны 3
                                                        t1=abs(R[l][0]-R[j][0]);
                                                        t2=abs(R[l][1]-R[j][1]);
                                                        t=t1*t1+t2*t2;
                                                        //c=sqrt(t);
                                                        c=pow(t,0.5);

                                                //подсчет полупериметра и площади
                                                        p=(a+b+c)/2;
                                                        //S=sqrt(p*(p-a)*(p-b)*(p-c));
                                                        rad=sqrt((p-a)*(p-b)*(p-c)/p);
                                                        fuct=fuct+1;
                                                        g=l;
                                                }//закрывает иф внутри цикла по Л
                                               
                                        }
                                        if (fuct=2 && g!=l)
                                                {
                                                        S4++;
                                                        t1=abs(R[i][0]-R[g][0]);
                                                        t2=abs(R[i][1]-R[g][1]);
                                                        t=t1*t1+t2*t2;
                                                        if (t<=rad){g1=g1+1;}

                                                        t1=abs(R[j][0]-R[g][0]);
                                                        t2=abs(R[j][1]-R[g][1]);
                                                        t=t1*t1+t2*t2;
                                                        if (t<=rad){g1=g1+1;}

                                                        t1=abs(R[l][0]-R[g][0]);
                                                        t2=abs(R[l][1]-R[g][1]);
                                                        t=t1*t1+t2*t2;
                                                        if (t<=rad){g1=g1+1;}

                                                        if (g1=3){m1=m1+1;}
                                                        else {n1=n1+1;}
                                                        g1=0;
                                                }
                                }//закрытие цикла по Л
                                if (m1>n1 )//&& m1-n1>e)
                                {
                                        F[0][0]=R[i][0];
                                        F[0][1]=R[i][1];
                                       
                                        F[1][0]=R[j][0];
                                        F[1][1]=R[j][1];

                                        F[2][0]=R[g][0];
                                        F[2][1]=R[g][1];
                                       
                                        m=m1;
                                        n=n1;
                                        //e=m-n;

                                }
                               
                        }//закр условие внутри цикла по джи


                }//закрытие цикла по джи


        }//закрытие цикла по и


        cout<<"answer:\n";
        for(i=0;i<3;i++)
        {
                cout<<"x"<<"["<<i<<"]="<<F[i][0]<<"\n";
                cout<<"y"<<"["<<i<<"]="<<F[i][1]<<"\n";
                cout<<"\n";
        }
        //cout<<"S4="<<S4<<"\n";

    system("pause");
        return 0;
}
 

 Профиль  
                  
 
 Re: Построить треугольник по заданным условиям (на С++)
Сообщение01.04.2014, 15:09 


05/09/12
2587
В коде не разбирался, но навскидку надо правильно перебирать все возможные треугольники - чтобы не дублировать уже проверенные в другом порядке вершин и чтобы гарантированно все 3 вершины были различны - тогда программа в принципе не сможет выдать 2 одинаковые точки, да и количество переборов будет сведено к минимуму. Сделать это очень просто. Для начала напишите словами и реализуйте в коде алгоритм перебора треугольников, удовлетворяющий этим требованиям.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group