208f870e0de1daae2938dfc31c81e967f24359b9
5 struct line
{ enum {horz
, vert
, diag
} d
; int x1
; int y1
; int x2
; int y2
; };
7 #define max(x, y) ((x)>(y) ? (x) : (y))
8 #define min(x, y) ((x)<(y) ? (x) : (y))
9 #define between(a, a1, a2) ((a) >= min(a1, a2) && (a) <= max(a1, a2))
11 int parse_lines(struct line lines
[], int *maxx
, int *maxy
)
15 while (fgets(buf
, 1000, stdin
) != NULL
) {
17 lines
[i
].x1
= strtol(p
, &p
, 10);
19 lines
[i
].y1
= strtol(p
, &p
, 10);
21 lines
[i
].x2
= strtol(p
, &p
, 10);
23 lines
[i
].y2
= strtol(p
, &p
, 10);
24 if (lines
[i
].x1
== lines
[i
].x2
)
26 else if (lines
[i
].y1
== lines
[i
].y2
)
28 else if (abs(lines
[i
].y2
-lines
[i
].y1
) == abs(lines
[i
].x2
-lines
[i
].x1
))
32 *maxx
= max(*maxx
, lines
[i
].x1
);
33 *maxx
= max(*maxx
, lines
[i
].x2
);
34 *maxy
= max(*maxy
, lines
[i
].y1
);
35 *maxy
= max(*maxy
, lines
[i
].y2
);
41 bool online(int x
, int y
, struct line line
)
46 return y
== line
.y1
&& between(x
, line
.x1
, line
.x2
);
48 return x
== line
.x1
&& between(y
, line
.y1
, line
.y2
);
50 slope
= (line
.y2
- line
.y1
) / (line
.x2
- line
.x1
);
51 return y
-line
.y1
== slope
*(x
-line
.x1
)
52 && between(y
, line
.y1
, line
.y2
) && between(x
, line
.x1
, line
.x2
);
59 struct line lines
[1000];
60 int maxx
= 0, maxy
= 0;
61 int nlines
= parse_lines(lines
, &maxx
, &maxy
);
63 for (int x
= 0; x
<=maxx
; x
++) {
64 for (int y
= 0; y
<=maxy
; y
++) {
66 for (int line
= 0; line
<nlines
&& matches
< 2; line
++)
67 if (online(x
, y
, lines
[line
]))
69 r
= matches
>= 2 ? r
+1 : r
;