MAC0122 Desenvolvimento de Algoritmos
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "Point.h"
typedef struct node *link;
struct node {
point p;
link next;
};
link **grid;
int G;
float d;
int cnt = 0;
gridinsert(float x, float y) {
int i, j;
link s;
int X = x*G + 1;
int Y = y*G + 1;
link t = malloc(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)
if (distance(s->p, t->p) < d) cnt++;
t->next = grid[X][Y];
grid[X][Y] = t;
}
float randFloat (void) {
return 1.0 * rand() / RAND_MAX;
// erro no Sedgewick: o denominador deveria ser
// ((float)RAND_MAX + 1.0)
}
main(int argc, char *argv[]) {
int i, j, N = atoi(argv[1]);
d = atof(argv[2]);
G = 1/d; // G <= 1/d < G+1
grid = malloc2d(G+2, G+2);
for (i = 0; i < G+2; i++)
for (j = 0; j < G+2; j++)
grid[i][j] = NULL;
for (i = 0; i < N; i++)
gridinsert(randFloat(), randFloat());
printf("%d edges shorter than %f\n", cnt, d);
}
A função malloc2d precisa ser adaptada a partir do seguinte Program 3.16 (two-dimensional array allocation):
// Aloca, dinamicamente, uma matriz inteira
// r-por-c, ou seja, uma matriz de r linhas e c
// colunas cujos elementos são int. Devolve o
// endereço da matriz alocada.
//
int **malloc2d(int r, int c) {
int i;
int **a = malloc(r * sizeof (int*));
for (i = 0; i < r; i++)
a[i] = malloc(c * sizeof (int));
return a;
}
Eis o arquivo Point.h:
// Program 3.3 (Point data type interface)
//
typedef struct {
float x;
float y;
} point;
float distance(point a, point b);
Eis o arquivo Point.c:
// Program 3.4 (Point data type implementation)
//
#include <math.h>
#include "Point.h"
float distance(point a, point b) {
float dx = a.x - b.x, dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}