10 // determined by pre-inspecting input with wc
15 typedef struct point point
;
16 typedef struct key key
;
21 static point grid
[ROWS
][COLS
];
27 static key keys
[KEYS
];
29 static int min
= 99999999;
32 permute (int *a
, int size
, int n
)
40 for (i
= 0; i
< n
; i
++) {
53 for (i
= 0; i
< size
; i
++) {
54 permute (a
, size
- 1, n
);
67 int main(int argc
, char **argv
)
72 while ((c
= getchar ()) >= 0) {
93 printf ("parsed grid, found %d interesting points to visit\n", count
);
94 for (int k
= 0; k
< count
; k
++) {
95 printf ("finding distances from key %d:", k
);
96 for (i
= 0; i
< ROWS
; i
++)
97 for (j
= 0; j
< COLS
; j
++)
98 grid
[i
][j
].distance
= -(grid
[i
][j
].c
== '#');
99 grid
[keys
[k
].y
][keys
[k
].x
].distance
= 1;
102 while (found
< count
) {
103 for (i
= 0; i
< ROWS
; i
++)
104 for (j
= 0; j
< COLS
; j
++)
105 if (grid
[i
][j
].distance
== gen
) {
106 if (grid
[i
][j
].c
!= '.') {
108 keys
[k
].d
[grid
[i
][j
].c
- '0'] = gen
- 1;
110 if (!grid
[i
- 1][j
].distance
)
111 grid
[i
- 1][j
].distance
= gen
+ 1;
112 if (!grid
[i
+ 1][j
].distance
)
113 grid
[i
+ 1][j
].distance
= gen
+ 1;
114 if (!grid
[i
][j
- 1].distance
)
115 grid
[i
][j
- 1].distance
= gen
+ 1;
116 if (!grid
[i
][j
+ 1].distance
)
117 grid
[i
][j
+ 1].distance
= gen
+ 1;
121 for (i
= 0; i
< count
; i
++)
122 printf ("%4d", keys
[k
].d
[i
]);
125 int a
[] = { 1, 2, 3, 4, 5, 6, 7 };
126 permute (a
, count
- 1, count
- 1);
127 printf ("best case visit requires %d steps\n", min
);