[C++]Zadanie ze SPOJ'a

0

Mam problem z tym zadaniem: http://pl.spoj.pl/problems/PP0506A/. Napisałem program, który działa według mnie dobrze, ale SPOJ go nie akceptuje.

#include <iostream>
#include <string>

using namespace std;

struct punkt
{
	string str;
	int x,y;
};

int main(int argc, char * argv[])
{
	int t,n,a1,a2,b1,b2;
	int z=1;
	punkt pom;
	cin>>t;
	while(t)
	{
		cin>>n;
		punkt *p=new punkt[n];
		for(int i=0;i<n;i++)
			cin>>p[i].str>>p[i].x>>p[i].y;
		do
		{
			z=0;
			for(int i=0;i<n-1;i++)
			{
				a1=p[i].x;
				b1=p[i].y;
				if(a1<0)
					a1*=-1;
				if(b1<0)
					b1*=-1;

				a2=p[i+1].x;
				b2=p[i+1].y;
				if(a2<0)
					a2*=-1;
				if(b2<0)
					b2*=-1;

				if((a1+b1)>(a2+b2))
				{
					pom.x=p[i+1].x;
					pom.y=p[i+1].y;
					pom.str=p[i+1].str;
					p[i+1].x=p[i].x;
					p[i+1].y=p[i].y;
					p[i+1].str=p[i].str;
					p[i].x=pom.x;
					p[i].y=pom.y;
					p[i].str=pom.str;
					z=1;
				}else if((a1+b1)==(a2+b2))
				{
					if(p[i].str>p[i+1].str)
					{
						pom.x=p[i+1].x;
						pom.y=p[i+1].y;
						pom.str=p[i+1].str;
						p[i+1].x=p[i].x;
						p[i+1].y=p[i].y;
						p[i+1].str=p[i].str;
						p[i].x=pom.x;
						p[i].y=pom.y;
						p[i].str=pom.str;
						z=1;
					}
				}
			}
		}while(z==1);
		cout<<endl;
		for(int i=0;i<n;i++)
		{
			cout<<p[i].str<<" "<<p[i].x<<" "<<p[i].y<<endl;
		}
		cout<<endl;
		--t;
		delete []p;
	}
	return 0;
}

Wie ktoś może co trzeba w tym programie poprawić?

0

Hint:abs(xx + yy).

0

Przede wszystkim formatowanie. Oczy bolą od samego patrzenia na ten kod...

Po drugie - Po co niby wstawiasz tam te cout<<endl? Pisze ci gdzieś w wyjściu "oddziel wejście od wyjścia enterem"? Usuń to.

Jeśli dalej nie będzie działać to popraw formatowanie kodu i wklej jeszcze raz i można się zastanawiać...

@t0m_k - po twoim poście sobie coś przypomniałem i znalazłem kod na to samo zadanie gdzieś u siebie w archiwum :) Co ciekawe używałem sqrt(xx + yy) - cóż za marnotrawstwo... (<-- edit: literówka, dzięki za poprawienie...)

0
MSM napisał(a)

@t0m_k - po twoim poście sobie coś przypomniałem i znalazłem kod na to samo zadanie gdzieś u siebie w archiwum :) Co ciekawe używałem sqrt(xx + yy) - cóż za marnotrastwo...

hehe, tez wzialem to z abs z rozwiazania, ale tez jest nie potrzebne...

0

Dodałem funkcję abs i dalej program nie jest akceptowany ;/
http://ideone.com/61vQL

0

Napisalem, ze jest nie potrzebne abs, jesli chodzi o tego hinta co Ci dalem, bo nie ma mozliwosci, aby wyszedl minus. Cala filozofia polega na pomnozeniu, a nie dodaniu wspolrzednych oraz odpowiednim posortowaniu.

0

Abs samo w sobie nic nie robi, tutaj raczej nie jest konieczne.

abs(xx + yy)

Chyba rozumiesz ten wzór? I widzisz różnicę między

(abs(p[i].x)+abs(p[i].y))>(abs(p[i+1].x)+abs(p[i+1].y))

I wiem że to kod jednorazowy, ale sensowne nazwanie zmiennych i formatowanie kodu nic nie kosztuje, a uniknąłbyś być może takich błędów...

No i usunąłeś tylko 1 endl, a masz ich 2 w kodzie.

0

W treści zadania jest napisane: "Kolejne testy oddzielone są jednym pustym wierszem.", czyli jeden endl musi zostać.

0

To że testy są oddzielone jednym pustym wierszem to inna sprawa.

Powinieneś raczej zacytować:

Po każdym przypadku testowym jedna linia odstępu.

No i faktycznie, racja, endl musi zostać.

Udało ci się poprawić ten wzór?

0

Nie mam pomysłu jak to zrobić jeśli użyję tego wzoru to nie wiem jak zrobić sortowanie.

0

Nie zapisuj w strukturze x i y tylko odległość od środka (albo kwadrat odległości, oszczędzisz sobie liczenia). To pierwszy pomysł. Drugim pomysłem jest po prostu posortowanie tego przez qs z sensownym comparatorem

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
0

Zrob sobie dajmy na to taka strukture.

struct {
   int x, y, s;
} point_t;

s - ten wzor
Pobierajac dane w petli zapisujesz sobie wszystko do tablicy struktur i od razu wypelniasz to 's'.

Sortujesz wedlug tego 's' i po sprawie.

0

Dzięki za pomoc, już program działa poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1