REASY Вот честно. Ну не хотелось давать исходник и лишать Вас возможности самому подумать. Но уже ввязался, так что в первый и в последний раз... Code (Text): #include <stdio.h> #include <math.h> //функция получает косинус угла по координатам вершины (XApex,YApex) и двух точек double getAngleCos(double XApex,double YApex,double X1,double Y1,double X2,double Y2); //массивы для хранения координат точек double X[10000],Y[10000]; //массив для хранения номеров передатчиков и счетчик передатчиков int dotNums[10000],dotNumCntr=0; void main() { //H,W,N - из условия задачи //par,par2 - счетчики любых циклов //rightestDotNum - номер самого правого передатчика //prevDotNum - номер предыдущего найденного передатчика, //apexDotNum - номер передатчика, который на данный момент считается вершиной угла //newDotNum - номер вновь найденного передатчика //buf - промежуточный буфер для сортировки int H,W,N,par,par2,rightestDotNum,prevDotNum,apexDotNum,newDotNum,buf; double rightestX=0,minimalCos=1,curCos; //считываем входные данные и попутно находим самый правый объект scanf("%d%d%d",&H,&W,&N); for (par=0; par<N; par++) { scanf("%lf%lf",&X[par],&Y[par]); if(X[par]>rightestX) { rightestX = X[par]; rightestDotNum = par; } } //считаем самый правый передатчик вершиной угла и находим два //объекта, которые с ним образуют максимальный угол //(косинус этого угла должен быть минимален) for (par=0; par<N; par++) for (par2=par+1; par2<N; par2++) if (par!=rightestDotNum && par2!=rightestDotNum) { curCos = getAngleCos(X[rightestDotNum],Y[rightestDotNum],X[par],Y[par],X[par2],Y[par2]); if (curCos<minimalCos) { minimalCos = curCos; newDotNum = par; } } //циклически находим объекты, образующие максимальный угол с двумя последними найденными //до тех пор пока повторно не найдем самый правый передатчик dotNums[dotNumCntr++] = rightestDotNum; apexDotNum = rightestDotNum; do { minimalCos = 1; prevDotNum = apexDotNum; apexDotNum = newDotNum; dotNums[dotNumCntr++] = newDotNum; for (par=0; par<N; par++) { if (par==prevDotNum || par==apexDotNum) continue; curCos = getAngleCos(X[apexDotNum],Y[apexDotNum],X[prevDotNum],Y[prevDotNum],X[par],Y[par]); if (curCos<minimalCos) { minimalCos = curCos; newDotNum = par; } } } while (newDotNum != rightestDotNum); //сортируем номера передатчиков по возрастанию и попутно их выводим for (par=0; par<dotNumCntr; par++) { for (par2=par+1; par2<dotNumCntr; par2++) if (dotNums[par]>dotNums[par2]) { buf=dotNums[par]; dotNums[par]=dotNums[par2]; dotNums[par2]=buf; } printf("%d\n",dotNums[par]+1); } } double getAngleCos(double XApex,double YApex,double X1,double Y1,double X2,double Y2) { return ((X1-XApex)*(X2-XApex)+(Y1-YApex)*(Y2-YApex))/(hypot(Y1-YApex,X1-XApex)*hypot(Y2-YApex,X2-XApex)); } P.S. Так и не понял, зачем нужны были H и W.