Skip to content

Commit 9f43422

Browse files
authored
Merge pull request #3004 from mdmzfzl/main
Create: 0332-reconstruct-itinerary.c
2 parents 9e12abe + 0accc7c commit 9f43422

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

Diff for: c/0332-reconstruct-itinerary.c

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
int cmp(const void *a, const void *b) {
2+
const char **s1 = *(const char ***)a, **s2 = *(const char ***)b;
3+
int c = strcmp(s1[0], s2[0]);
4+
if (c) return c;
5+
return strcmp(s1[1], s2[1]);
6+
}
7+
8+
int dfs(int *v, char ***tickets, int n, char **p, int last, int d) {
9+
int i;
10+
11+
if (d == n) {
12+
p[n] = tickets[last][1];
13+
return 1;
14+
}
15+
16+
for (i = 0; i < n; i++) {
17+
if (!v[i] && !strcmp(tickets[last][1], tickets[i][0])) {
18+
v[i] = 1;
19+
p[d] = tickets[i][0];
20+
if (dfs(v, tickets, n, p, i, d + 1)) return 1;
21+
v[i] = 0;
22+
}
23+
}
24+
25+
return 0;
26+
}
27+
28+
char** findItinerary(char*** tickets, int ticketsRowSize, int ticketsColSize, int* returnSize) {
29+
int *v, i, done;
30+
char **p;
31+
32+
qsort(tickets, ticketsRowSize, sizeof(char **), cmp);
33+
34+
p = (char **)malloc((ticketsRowSize + 1) * sizeof(char *));
35+
v = (int *)calloc(ticketsRowSize, sizeof(int));
36+
37+
done = 0;
38+
for (i = 0; !done && i < ticketsRowSize; i++) {
39+
if (!strcmp(tickets[i][0], "JFK")) {
40+
v[i] = 1;
41+
p[0] = tickets[i][0];
42+
done = dfs(v, tickets, ticketsRowSize, p, i, 1);
43+
v[i] = 0;
44+
}
45+
}
46+
47+
*returnSize = ticketsRowSize + 1;
48+
free(v);
49+
50+
return p;
51+
}

0 commit comments

Comments
 (0)