/- 프로그램 명 : 단위 크기의 정사각형에 있는 N개의 점에 대한 순서쌍 중 몇 개가 d 보다 작은 거리를 갖는지 알아보기 *-

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include "Point.h"

/- Point.h

typedef struct Point{

float x, y;

} Point;

*-

typedef struct node *link;

struct node{

point p;

link next;

};

link **grid; // 격자

int G;

float d; // 거리

int cnt = 0; // count

gridinsert(float x, float y)

{

int i, j;

link s;

int X = x*G + 1, Y = y*G + 1; // 삽입할 데이터의 범위(격자위치)를 찾는다.

link t = (link*) calloc(1, sizeof(*t));

t->p.x = x, t->p.y = y;

for(i = X-1; i <= X+1; i++)

for(j = Y-1; j <= Y+1; j++)

for(s = grid[i][j]; s != NULL; s = s->next)

// d 거리 이내일 경우 개수를 더한다.

if(distance(s->p, t->p) < d)

cnt++;

// 데이터를 격자 범위에다 삽입한다.

t->next = grid[X][Y], grid[X][Y] = t;

}

link **malloc2d(int r, int c) // 이차원 calloc(malloc)

{

int i;

link **t = (link**) calloc(r, sizeof(*t));

for(i=0; i<r; i++)

t[i] = (link*) calloc(c, sizeof(*t[i]));

return t;

}

int main(void)

{

int i, j, N;

scanf("%d %f", &N, &d);

G = 1/d, grid = malloc2d(G+3, G+3);

// grid 생성, G 는 격자 범위를 나타내는 수

for(i=0; i < G+3; i++)

for(j=0; j < G+3; j++)

grid[i][j] = NULL;

for(i=0; i < N; i++)

gridinsert(randFloat(), randFloat());

// 데이터 삽입 randFloat 함수는 return 1.0 * rand()/RAND_MAX; 한다

printf("%d edges shorter than %f\n", cnt, d);

return 0;

}

 

'A > Algorithm' 카테고리의 다른 글

재밋는? 러시아 페인트공 알고리즘  (0) 2011.10.27
냅색(Knapsack:배낭) 문제  (0) 2011.10.27
토끼와 거북이 알고리즘  (0) 2011.10.27
XOR 교체 알고리즘  (0) 2011.10.27
욕심쟁이(Greedy) 알고리즘  (0) 2011.10.27

설정

트랙백

댓글