Analiza programów

17.06.2009

Trójkąt prostokątny

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int points,
	a,
	b,
	result;
 
pair < int, int > point [ 2000 ]; //REV: typ pair<int,int> zasługuje na nazwanie typename'em
//REV: sprawdzić wydajnościowo : czy wskaźnik na parę intów nie zajmuje tyle samo, co para intów?
//REV: dlaczego static?
static inline long long unsigned int length ( pair < int, int > & A, pair < int, int > & B )
{//REV: po co abs przy liczeniu kwadratu?
	return ( long long unsigned int ) abs ( A . first - B . first ) * abs ( A . first - B . first ) + ( long long unsigned int ) abs ( A . second - B . second ) * abs ( A . second - B . second );
}
//REV: dlaczego static?
static inline bool check ( pair < int, int > & A, pair < int, int > & B, pair < int, int > & C )
{
	long long unsigned int a = length ( A, B ),
						   b = length ( A, C ),
						   c = length ( C, B );
	//REV: czy tu na pewno nie może się zdazyć overflow?
	//REV: czy współliniowości nie da się sprawdzić jakimś iloczynem (skalarnym, wektorowym?)
	return ( a + b == c || a + c == b || b + c == a );
}
 
int main ( void )
{
	scanf ( "%d", & points );
	for ( int p = 0; p < points; ++ p )
	{
		scanf ( "%d %d", & a, & b ); //REV: czy tymczasowe zmienne a i b, są potrzebne?
		point [ p ] = pair < int, int > ( a, b ); //REV: czy tymczasowy punkt jest potrzebny?
	}
 
	for ( int k = 0; k < points; ++ k )
		for ( int l = k + 1; l < points; ++ l ) 	//REV: czy nie możnaby jakoś pogrupować elementów na tej samej prostej (sortowanie po kącie, tangensie itp?)
			for ( int m = l + 1; m < points; ++ m ) //REV: n^3 dla n=2000?
				result += check ( point [ k ], point [ l ], point [ m ] ); 	//REV: type hack
 
	printf ( "%d\n", result ); 	
	return 0;
}
 

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com