summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-09-26 17:05:39 -0600
committermo khan <mo.khan@gmail.com>2020-09-26 17:05:39 -0600
commite7fc8f9de29fbcd28b32d0ad743de9af0751340a (patch)
treed34ac73f998c3809a4546d48efa768880ebf0a68
parentddbdfe54c7f8f1dfb819c32aff966d8f478a92e3 (diff)
feat: implement backtracking algorithm to visit each edge in both directions
-rw-r--r--src/03/05/README.md8
-rw-r--r--src/03/graph_test.c26
2 files changed, 24 insertions, 10 deletions
diff --git a/src/03/05/README.md b/src/03/05/README.md
index eae128c..72831f2 100644
--- a/src/03/05/README.md
+++ b/src/03/05/README.md
@@ -543,9 +543,15 @@ a higher priority concern than time.
To traverse every edge in both directions we can use an adjacency matrix
and iterate through every cell in the matrix. If the cell contains a 1 to
-indicate a connection than we know that we can traverse from the edge at
+indicate an edge than we know that we can traverse from the edge at
that row and column. Both directions will be represented in different cells
in the matrix.
When we visit each cell in the matrix we can flip the 1 to a 0 to ensure that
we do not revisit a visited edge.
+
+1. Start at any vertex
+2. Iterate through list of edges.
+3. If the vertex on the other end of the edge has not been visited yet then visit it and loop until all edges are exhausted for the vertex.
+4. Backtrack to previous vertex
+5. Visit any edge where you can backtrack safely.
diff --git a/src/03/graph_test.c b/src/03/graph_test.c
index e833573..55ee588 100644
--- a/src/03/graph_test.c
+++ b/src/03/graph_test.c
@@ -100,33 +100,41 @@ void traverse(int vertex) {
printf("->(%c)", labels[vertex]);
}
}
+ for (int edge = 0; edge < 16; ++edge) {
+ if (graph[vertex][edge] > 0 && graph[edge][vertex] > 0) {
+ graph[vertex][edge] = 0;
+ traverse(edge);
+ graph[edge][vertex] = 0;
+ printf("->(%c)", labels[vertex]);
+ }
+ }
}
-void inspect_graph() {
+void graph_inspect(int n) {
printf("\n");
printf("| ");
- for (int i = 0; i < 16; ++i)
+ for (int i = 0; i < n; ++i)
printf("|%c", labels[i]);
printf("|\n");
- for (int i = 0; i < 16; ++i) {
+ for (int i = 0; i < n; ++i) {
printf("|%c|", labels[i]);
- for (int j = 0; j < 16; ++j)
+ for (int j = 0; j < n; ++j)
printf("%d|", graph[i][j]);
printf("\n");
}
}
Ensure(every_edge_is_traversed_in_both_directions_at_least_once) {
+ int n = 16;
+
traverse(0);
- inspect_graph();
+ graph_inspect(n);
- for (int i = 0; i < 16; ++i) {
- for (int j = 0; j < 16; ++j) {
+ for (int i = 0; i < n; ++i)
+ for (int j = 0; j < n; ++j)
assert_that(graph[i][j], is_equal_to(0));
- }
- }
}
TestSuite *graph_tests() {