a332dd447774afb720e7fc9801cd5cfe354ae37d
8 struct point
{ int x
; int y
; };
9 struct entry
{ struct point key
; UT_hash_handle hh
; };
12 if ((x) >= 1 && (y) >= 1 && (x) <= maxx+1 && (y) <= maxy+1)\
13 stack[sp++] = (struct point){x, y};\
16 int basin(int grid
[102][102], int maxx
, int maxy
, int x
, int y
)
18 printf("calculate basin for: %d,%d -- ", x
, y
);
19 struct point stack
[1000];
20 memset(stack
, 0, sizeof stack
);
21 struct entry
*visited
= NULL
;
25 stack
[sp
++] = (struct point
){.x
=x
, .y
=y
};
29 memset(&p
, 0, sizeof p
);
32 HASH_FIND(hh
, visited
, &p
, sizeof(struct point
), e
);
36 e
= calloc(1, sizeof(struct entry
));
38 HASH_ADD(hh
, visited
, key
, sizeof(struct point
), e
);
40 if (grid
[p
.y
][p
.x
] == 9)
49 printf(" %d\n", size
);
53 void insert(int tl
[3], int s
)
55 if (s
> tl
[0] && s
<= tl
[1])
57 if (s
> tl
[1] && s
<= tl
[2]) {
71 for (int i
= 0; i
<102; i
++)
72 for (int j
= 0; j
<102; j
++)
77 while((c
= getchar()) != EOF
) {
82 maxx
= x
> maxx
? x
: maxx
;
88 for (int cy
= 1; cy
<y
; cy
++)
89 for (int cx
= 1; cx
<maxx
+1; cx
++)
90 if (grid
[cy
][cx
] < grid
[cy
+1][cx
] &&
91 grid
[cy
][cx
] < grid
[cy
-1][cx
] &&
92 grid
[cy
][cx
] < grid
[cy
][cx
+1] &&
93 grid
[cy
][cx
] < grid
[cy
][cx
-1])
94 insert(tl
, basin(grid
, maxx
, y
, cx
, cy
));
95 printf("%d %d %d\n", tl
[0], tl
[1], tl
[2]);
96 printf("%d\n", tl
[0]*tl
[1]*tl
[2]);