Sortowanie punktów względem odległości, jak wypisać punkty razem z ich nazwami?

0

Witam,
Chciałbym prosić o wskazówki dotyczące rozwiązania ze SPOJ, mianowicie mam podane kilka punktów, w postaci ich nazwy, i współrzędnych. Zadanie polega na posortowaniu tych punktów względem ich odległości od środka układu współrzędnych i wypisaniu ich. Wiem, w jaki sposób wykonać to zadanie od strony matematycznej i w jaki sposób je posortować, jednak nie wiem w jaki sposób mam również uwzględnić nazwę tych punktów, przy wypisywaniu.
Myślałem nad utworzeniem pliku tekstowego, w którym przechowywałbym nazwy tych punktów i po posortowaniu odczytywałbym tylko konkretne linijki z tego tekstu, jednak nie jestem pewien, czy SPOJ umożliwia tworzenie dodatkowych plików i nie do końca wiem jak odczytywać tylko konkretne linijki z tekstu.

Link do zadania: http://pl.spoj.com/problems/PP0506A/

2

Mapa współrzędne ⟶ string. Nie ma sensu bawić się w żadne pliki, nawet jeśli technicznie jest to możliwe.

http://en.cppreference.com/w/cpp/container/map

0

A mógłbym prosić o przykład rozwiązania, bo jak dotąd nigdy się nie spotkałem z pojemnikami i nie do końca rozumiem jak to działa

0

Ależ dziękuje :D

0

A więc doszedłem do czegos takiego

#include <iostream>
#include<cstdlib>
#include<math.h>
#include<map>


using namespace std;

void sortowanie_babelkowe_tablicy (int  n,int **tab ) //do n podajemy ile,
{
    for(int i=0; i<n; i++)
        for(int j=1; j<n-i; j++)
        {
            if(tab[j-1][2]>tab[j][2])

            swap(tab[j-1][0], tab[j][0]);
            swap(tab[j-1][1], tab[j][2]);
            swap(tab[j-1][2], tab[j][2]);
            swap(tab[j-1][3], tab[j][3]);
        }
}

int main()
{
    int n, ile;    //n oznacza liczbe testow, a ile, ile punktow bedziemy porownywac
    const int a=4; // potrzebuje 4 kolumn (w pierwszych dwoch beda wspó³rzedne, w trzeciej odleg³osc, a w czwartej kolejne liczby naturalne)
    for(int z=0; z<n; z++)
    {
        cin>>ile;
        for(int i=0; i<ile; i++)    //wczytujemy ile punktow bedziemy porownywac
        {
            map<int,string> punkty; //deklaracja mapy

            int x,y;
            string nazwa;
            int **tab = new int *[ile];       //deklaracja tablicy dynamicznej o ile wierszach i 4 kolumnach
            for ( int j = 0; j < ile; ++j )
            {
                tab[i] = new int [a];

            }

            for(int j=0; j<ile; j++)                //wype³niamy tablice naszymi danymi z punktami
            {
                cin>>nazwa;
                punkty[j]=nazwa;                     //wczytanie nazwy punkty
                tab[j][0]=x;
                tab[j][1]=y;
                tab[j][2]=sqrt(x*x+y*y);
                tab[j][3]=j+1;                      //chce zeby w mapie numerowac od 1
            }
            sortowanie_babelkowe_tablicy(ile, tab[ile][4]);
            for(int k=0;k<ile;k++)
            {
            cout<<punkty[(tab[ile][3])];
            cout<<" "<<tab[ile][0]<<" "<<tab[ile][1]<<endl;
            }
        }
    }
    return 0;
}

 

i niestety dalej nie działa. W jaki sposób mam przekazać tą tablicę dynamiczną do funkcji sortującej? I czy popełniłem jeszcze jakieś inne błedy?

1

Ależ przekombinowujesz. Wystarczyło przeczytać, że mapa sortuje elementy w/g przekazanego komparatora. Masz przykładowy kod:

#include <iostream>
#include <map>
#include <string>
#include <cmath>
using namespace std;


struct PointCmp
{
	template<typename T, typename U>
	bool operator()(T&& l, U&& r) const {
		return hypot(l.first, l.second) < hypot(r.first, r.second);
	}

	using is_transparent = true_type;
};

auto main() -> int
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int tests;
	cin >> tests;
	while(tests --> 0){
		int points;
		cin >> points;
		map<pair<int,int>, string, PointCmp> data;
		while(points --> 0){
			int x, y;
			string s;
			cin >> s >> x >> y;
			data.emplace(make_pair(x,y), s);
		}
		for(auto const& p : data){
			cout << p.second << " " << p.first.first << " " << p.first.second << endl;
		}
		cout << endl;
	}
}
0
kq napisał(a):

Ależ przekombinowujesz. Wystarczyło przeczytać, że mapa sortuje elementy w/g przekazanego komparatora. Masz przykładowy kod:

#include <iostream>
#include <map>
#include <string>
#include <cmath>
using namespace std;


struct PointCmp
{
	template<typename T, typename U>
	bool operator()(T&& l, U&& r) const {
		return hypot(l.first, l.second) < hypot(r.first, r.second);
	}

	using is_transparent = true_type;
};

auto main() -> int
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int tests;
	cin >> tests;
	while(tests --> 0){
		int points;
		cin >> points;
		map<pair<int,int>, string, PointCmp> data;
		while(points --> 0){
			int x, y;
			string s;
			cin >> s >> x >> y;
			data.emplace(make_pair(x,y), s);
		}
		for(auto const& p : data){
			cout << p.second << " " << p.first.first << " " << p.first.second << endl;
		}
		cout << endl;
	}
}

Hmm, rozumiem połowę z twojego kodu :D, działam na tym co potrafię zrobić, już wiem w jaki sposób przekazać dynamiczna tablice wielowymiarową do funkcji, jednak moja jest tak naprawdę dynamiczną tablicą "sztywnych tablic" i kompilator wywala mi błąd, że próbuje przekonwertować typ int na typ int**, więc w jaki sposób mógłbym przekazać własnie moja tablicę, czy też moja funkcja sortująca nie jest odpowiednio zadeklarowana dla tego typu tablic.

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