Здравствуйте.
Помогите, пожалуйста, найти ошибки в программе.
Условие:
На вход подаётся шесть точек. Нужно вычислить расположение треугольника и вывести координаты его вершин исходя из условий:
1) вершинами треугольника должны быть три точки из полученных на вход,
2) треугольник должен располагаться так, чтобы внутри него оказалось как можно больше точек из оставшихся (не попавших в вершины).
Ответом должны быть три точки - вершины полученного треугольника.
Для написания программы использовать язык С++.
Программа написана, но работает некорректно: она выдает 3 точки, 2 из которых одинаковые, чаще всего это точки с индексами 3 и 4 из исходного массива. Т.е. вместо треугольника получается отрезок.
Алгоритм такой:
На точках строим всевозможные треугольники. Проверяем для них условия, запоминаем результаты. Затем сравниваем в каком случае условие было выполнено наилучшим образом, т.е когда внутри оказалось больше всего точек и выводим координаты вершин, удовлетворяющие этому условию.
#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;
}