3db03bfb4a2e105b0cdc379c2f825b63aaac779f
7 struct point
{ int x
; int y
; };
8 struct entry
{ struct point key
; UT_hash_handle hh
; };
10 bool havevisited(struct entry
**visited
, int x
, int y
)
12 struct entry
*e
= NULL
;
14 memset(&p
, 0, sizeof(p
));
17 HASH_FIND(hh
, *visited
, &p
, sizeof(struct point
), e
);
21 void addvisited(struct entry
**visited
, struct point p
)
23 struct entry
*e
= calloc(1, sizeof(struct entry
));
25 HASH_ADD(hh
, *visited
, key
, sizeof(struct point
), e
);
28 int basin(struct entry
**visited
, int grid
[102][102], int x
, int y
)
30 struct point stack
[1000];
31 memset(stack
, 0, sizeof stack
);
35 stack
[sp
++] = (struct point
){.x
=x
, .y
=y
};
38 memset(&p
, 0, sizeof p
);
41 if (havevisited(visited
, p
.x
, p
.y
))
43 addvisited(visited
, p
);
45 if (grid
[p
.y
][p
.x
] == 9)
49 if (!havevisited(visited
, p
.x
+1, p
.y
))
50 stack
[sp
++] = (struct point
){.x
=p
.x
+1, .y
=p
.y
};
51 if (!havevisited(visited
, p
.x
-1, p
.y
))
52 stack
[sp
++] = (struct point
){.x
=p
.x
-1, .y
=p
.y
};
53 if (!havevisited(visited
, p
.x
, p
.y
+1))
54 stack
[sp
++] = (struct point
){.x
=p
.x
, .y
=p
.y
+1};
55 if (!havevisited(visited
, p
.x
, p
.y
-1))
56 stack
[sp
++] = (struct point
){.x
=p
.x
, .y
=p
.y
-1};
64 for (int i
= 0; i
<102; i
++)
65 for (int j
= 0; j
<102; j
++)
70 while((c
= getchar()) != EOF
) {
75 maxx
= x
> maxx
? x
: maxx
;
81 struct entry
*visited
= NULL
;
82 for (int cy
= 1; cy
<y
; cy
++) {
83 for (int cx
= 1; cx
<maxx
+1; cx
++) {
84 if (!havevisited(&visited
, cx
, cy
)) {
85 int s
= basin(&visited
, grid
, cx
, cy
);
90 } else if (s
>= tl
[1]) {
93 } else if (s
> tl
[2]) {
99 printf("%d\n", tl
[0]*tl
[1]*tl
[2]);