-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmylib.c
120 lines (104 loc) · 2.61 KB
/
mylib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//
// Created by Mazzi on 03/04/2021.
//
#include "mylib.h"
void QuickSortB(Building* B, int NN){
int lt=0, rt=NN-1;
QuickSortBR(B, lt, rt);
}
void QuickSortBR(Building* B, int lt, int rt ){
int q;
if (rt <= lt) return;
q = partitionB(B, lt, rt);
QuickSortBR(B, lt, q-1);
QuickSortBR(B, q+1, rt);
}
void swapB(Building* B1, Building *B2){
Building tmp = *B1;
*B1=*B2;
*B2=tmp;
}
int partitionB(Building* B, int lt, int rt ){
int i, j;
int x = B[rt].bc;
i = lt-1;
j = rt;
for ( ; ; ) {
while(B[++i].bc>x);
while(B[--j].bc< x);
if (j == lt) break;
if (i >= j) break;
swapB(&B[i],&B[j]);
}
swapB(&B[i],&B[rt]);
return i;
}
void QuickSortA(Antenna* A, int NN){
int lt=0, rt=NN-1;
QuickSortAR(A, lt, rt);
}
void QuickSortAR(Antenna* A, int lt, int rt ){
int q;
if (rt <= lt) return;
q = partitionA(A, lt, rt);
QuickSortAR(A, lt, q-1);
QuickSortAR(A, q+1, rt);
}
int partitionA (Antenna* A, int lt, int rt){
int i, j;
int x = A[rt].ac;
i = lt-1;
j = rt;
for ( ; ; ) {
while(A[++i].ac>x);
while(A[--j].ac< x);
if (j == lt) break;
if (i >= j) break;
swapA(&A[i],&A[j]);
}
swapA(&A[i],&A[rt]);
return i;
}
void swapA(Antenna* A1, Antenna* A2){
Antenna tmp = *A1;
*A1=*A2;
*A2=tmp;
}
int calcolaPoints(int **map, Antenna A, Building* B){
int i,j, idB, tot = 0, p;
int startX = A.ax-A.ar>0 ? A.ax-A.ar : 0;
int endX = A.ax+A.ar<W ? A.ax+A.ar : W-1;
int startY = A.ay-A.ar>0 ? A.ay-A.ar : 0;
int endY = A.ay+A.ar<H ? A.ay+A.ar : H-1;
for(j=startX; j<=endX; j++){
for(i=startY; i<=endY; i++){
if(abs(i-A.ay)+abs(j-A.ax)<=A.ar){
idB = map[i][j]-1;
if(idB>=0 && !B[idB].used){
p=(B[idB].bc*A.ac) - (B[idB].bl*(abs(i-A.ay)+abs(j-A.ax)));
tot+=p;
//B[idB].used=1;
}
}
}
}
return tot;
}
void togliB(int **map,int** map2, Antenna A, Building* B){
int i,j, idB;
int startX = A.ax-A.ar>0 ? A.ax-A.ar : 0;
int endX = A.ax+A.ar<W ? A.ax+A.ar+1 : W;
int startY = A.ay-A.ar>0 ? A.ay-A.ar : 0;
int endY = A.ay+A.ar<H ? A.ay+A.ar+1 : H;
map2[A.ay][A.ax]=-(A.id+1);
for(j=startX; j<endX; j++){
for(i=startY; i<endY; i++){
if(abs(i-A.ay)+abs(j-A.ax)<=A.ar){
idB = map[i][j]-1;
if(idB>=0 && !B[idB].used){
B[idB].used=1;
}
}
}
}
}