#include<stdlib.h>
#include<stdio.h>
# define SQR(x) ((x)*(x))

/******************************************************************************/
/* Ważna dla Ciebie struktury                                                                                           */
/******************************************************************************/

typedef struct {
    int x,y;
    int otoczka; /* wartosc zero oznacza, że punkt leży wewnątrz otoczki, 1 - nie wiadomo */
    } punkt;

/* struktura zawierająca punkty  (tablica wskaźników punktów i ich ilość) */

typedef struct {
    int ilosc_punktow;
    punkt **punkty;  /* tablica (wskaźników do) punktów na płaszczyźnie */
} punkty;

punkty tab_pt; /* ta struktura może być kopcem */

typedef struct el* welement;
typedef struct el{
  punkt *p;
  welement next;  
} element;

welement stos;
int ile2;
int numer_pomnika=0;
int pomnik_x,pomnik_y;
int tak;
/*******************************************************************************/

int dane_z_pliku(int argc, char *argv[]);

void wypisz_stos(void);

void graham();

/******************************************************************************/
/*Funkcja main                                                                                                                */
/******************************************************************************/

main(int argc, char *argv[])
{
    FILE* dane;
    int ile1,ile2,i;
    
	if (argc==2) dane=fopen(argv[1],"r"); else dane=fopen("graham_dane.txt","r");
	fscanf(dane,"%d",&ile1);
	fscanf(dane,"%d",&ile2);
	close(dane);
	
    for(i=0;i<ile2;i++){
      dane_z_pliku(argc,argv);
      graham();  
      wypisz_stos();
      //getchar();
      numer_pomnika++;
  }
  getch();            
  return 0;
}
/***************************************************************************/
/*     Definicje funkcji                                                                                                   */
/***************************************************************************/

/* Funkcje wczytujące dane z pliku */
int dane_z_pliku(int argc, char *argv[]){

	int i=0; /* ilosc wczytanych punktów */
	FILE* dane;
	punkt **pty;
	punkt **pomniki;
	punkt **kopia;
	int ilosc_punktow,ilosc;
    int ile1; //pkt
    int ile2; //pomniki
	if (argc==2) dane=fopen(argv[1],"r"); else dane=fopen("graham_dane.txt","r");
	//printf("Wczytuje dane\n");
	fscanf(dane,"%d",&ile1);
	fscanf(dane,"%d",&ile2);
	ilosc=ile1+ile2;
	ilosc_punktow=ile1+1;

	pty=(punkt**)malloc(ile1*sizeof(punkt*));
	pomniki=(punkt**)malloc(ile2*sizeof(punkt*));
	kopia=(punkt**)malloc(ilosc*sizeof(punkt*));
	int c;
	punkt *pt;
	while((c=getc(dane))!=EOF){
		ungetc(c,dane);
		pt=(punkt *)malloc(sizeof(punkt));
		fscanf(dane,"%d",&(pt->x));
		fscanf(dane,"%d\n",&(pt->y));
		pt->otoczka=1;
		if(i<ile1){
                    kopia[i]=pt;
                    //printf("do dane robocze: (%d,%d) przed pomnikiem \n",pt->x,pt->y);
        }
        if(i==numer_pomnika+ile1){
                    //printf("do dane robocze: (%d,%d) pomnik \n",pt->x,pt->y);
                    kopia[ile1]=pt;
                    pomnik_x=pt->x;
                    pomnik_y=pt->y;
        }
	    i++;
    }
    pty=kopia;
	
    tab_pt.ilosc_punktow=ilosc_punktow;
    tab_pt.punkty=pty;
	//printf("Dane zostaly wczytane\n");

	close(dane);
 	return 0;
}

/******************************************************************************/
/* Ważna dla Ciebie funkcja                                                                                             */
/******************************************************************************/
int porownaj1(punkt *p, punkt *p1, punkt *p2)
/* funkcja porównująca położenie punktów p1 i p2, p to punkt odniesienia, funkcja porównuje na podstawie kąta */
{ 
  int wyznacznik;
  wyznacznik=(p1->x-p->x)*(p2->y-p->y)-(p1->y-p->y)*(p2->x-p->x);

  return wyznacznik;
}
/*******************************************************************************/

int porownaj2(punkt *p, punkt *p1, punkt *p2)
/* funkcja porównująca położenie punktów p1 i p2, p to punkt odniesienia, funkcja porównuje na podstawie odległości */
{
    if (SQR(p1->x-p->x)+SQR(p1->y-p->y)>SQR(p2->x-p->x)+SQR(p2->y-p->y)) return 1;
    else  if (SQR(p1->x-p->x)+SQR(p1->y-p->y) == SQR(p2->x-p->x)+SQR(p2->y-p->y)) return 0;
    else return -1;
}

int porownaj(punkt *p, punkt *p1, punkt *p2)
{
    if (porownaj1(p,p1,p2)>0) return 1;
    else if (porownaj1(p,p1,p2)<0) return -1;
    else if (porownaj2(p,p1,p2)>0) { p2->otoczka=0; return 1;}
    else if (porownaj1(p,p1,p2)<0) { p1->otoczka=0; return -1;}
}

/* zamiana dwóch punktów  */
void swap(punkt **a,punkt **b)
{
  punkt *tmp;
  tmp=*a;
  *a=*b;
  *b=tmp;
}

/* funkcja wyznaczająca punkt p0 */
int findp0(punkty *a)
{
  int i;
  int p0=0;
  for(i=1;i< a->ilosc_punktow;i++)
    {

      if(a->punkty[i]->y< a->punkty[p0]->y) p0=i;
      else if(a->punkty[i]->y==a->punkty[p0]->y)  if(a->punkty[i]->x<a->punkty[p0]->x) p0=i;
    }
  return p0;
}

void heapify(punkty *a, int gdzie)
{
  int left,right,largest;
  
  if( (left=2*gdzie) <a->ilosc_punktow && (porownaj(a->punkty[0],a->punkty[left],a->punkty[gdzie])<0)) largest=left; else largest=gdzie;
  if( (right=2*gdzie+1) <a->ilosc_punktow && (porownaj(a->punkty[0],a->punkty[right],a->punkty[largest])<0)) largest=right;
  
  if(largest!=gdzie)  {swap(a->punkty+gdzie,a->punkty+largest); heapify(a,largest);}

}

void buildheap(punkty *a)
{
  int i;
  for(i=(a->ilosc_punktow-1)/2;i>0;i--) heapify(a,i);
}

void printtab(punkty *a)
{
  int i;

  for(i=0;i<a->ilosc_punktow;i++) printf("(%d,%d) ",a->punkty[i]->x,a->punkty[i]->y);
  printf("\n");
} 

void heapsort(punkty *a)
{
  int s;
  s=a->ilosc_punktow;

  int p0;
  p0=findp0(a);
  swap(a->punkty,a->punkty+p0);

  buildheap(a);
  a->ilosc_punktow--;
  while(a->ilosc_punktow>1)
    {
      swap(a->punkty+1,a->punkty+a->ilosc_punktow);
      heapify(a,1);
	a->ilosc_punktow--;
    }
  a->ilosc_punktow=s;
}


void inicjuj(void){ stos=NULL; }

void pop(void)
{
  welement tmp;
  tmp=stos;
  if (stos==NULL){ printf("Blad: pusty stos\n"); exit(-1);}
  stos=stos->next;
  free(tmp);
}

void push(punkt *p)
{
  welement tmp;

  tmp=(welement)malloc(sizeof(element));
  tmp->p=p;
  tmp->next=stos;
  stos=tmp;
}

punkt * top()
{
  if (stos!=NULL) return stos->p;
}

punkt * next_to_top()
{
  if (stos!=NULL) if (stos->next!=NULL) return stos->next->p;
}

void wypisz_stos(void)
{
  welement tmp;
  tmp=stos;
  if (stos==NULL){ printf("Blad: pusty stos\n"); exit(-1);}
  while(tmp!=NULL)
    {
      //printf("(%d,%d) ",tmp->p->x,tmp->p->y);
      if((tmp->p->x)==pomnik_x){
                                if((tmp->p->y)==pomnik_y) tak=1;
      }
      tmp=tmp->next;
    }
  if (tak==1) printf("TAK \n"); else printf("NIE \n");
  tak=0;
}

/***********************************************************/
/* To masz napisać                                                                         */
/***********************************************************/
int brak_skretu(punkt *p, punkt *p1, punkt *p2)
{ 
  if(porownaj1(p,p1,p2)>0) return 0; else return 1;
}

void graham()
{
  
  int i=1;
  inicjuj(); //inicjuje pusty stos
    //getch();
  heapsort(&tab_pt);
  push(tab_pt.punkty[0]);
  while(tab_pt.punkty[i]->otoczka==0) i++;
  push(tab_pt.punkty[i++]);
  while(tab_pt.punkty[i]->otoczka==0) i++;
  push(tab_pt.punkty[i++]);
  
  for(i; i<tab_pt.ilosc_punktow; i++){
                                      if(tab_pt.punkty[i]->otoczka){
                                                                     //while(brak_skretu(next_to_top(), top(), tab_pt.punkty[i])) pop();
                                                                     push(tab_pt.punkty[i]);
                                                                     }
                                      }
}

Dodaj komentarz

Dodajesz komentarz anonimowo. Zaloguj się.

Autor:
Treść:

Aby przesłać formularz, musisz mieć włączony w przeglądarce Javascript. Jeżeli nie masz, przepisz wspak tekst itzci5bzjw:

Wykop

Korzystanie z serwisu oznacza akceptację Regulaminu. Copyright – 1999-2012 INTERIA.PL Sp. z o.o., wszystkie prawa zastrzeżone.