|
| 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