Skip to content

Commit b3649cb

Browse files
authored
Add Depth First Search in C (#4315)
1 parent 7af6c7d commit b3649cb

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

archive/c/c/depth-first-search.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <math.h>
5+
#include <stdbool.h>
6+
7+
#define MAX_NODES 100
8+
9+
int adjacency_matrix[MAX_NODES][MAX_NODES];
10+
int vertex_values[MAX_NODES];
11+
int num_nodes;
12+
bool visited[MAX_NODES];
13+
14+
bool dfs(int node, int target) {
15+
if (vertex_values[node] == target) {
16+
return true;
17+
}
18+
visited[node] = true;
19+
for (int i = 0; i < num_nodes; i++) {
20+
if (adjacency_matrix[node][i] && !visited[i]) {
21+
if (dfs(i, target)) {
22+
return true;
23+
}
24+
}
25+
}
26+
return false;
27+
}
28+
29+
bool depth_first_search(int target) {
30+
memset(visited, 0, sizeof(visited));
31+
for (int i = 0; i < num_nodes; i++) {
32+
if (!visited[i] && dfs(i, target)) {
33+
return true;
34+
}
35+
}
36+
return false;
37+
}
38+
39+
void parse_matrix(char* input) {
40+
char* token = strtok(input, ", ");
41+
int i = 0, j = 0;
42+
while (token != NULL) {
43+
adjacency_matrix[i][j] = atoi(token);
44+
j++;
45+
if (j == num_nodes) {
46+
i++;
47+
j = 0;
48+
}
49+
token = strtok(NULL, ", ");
50+
}
51+
}
52+
53+
void parse_values(char* input) {
54+
char* token = strtok(input, ", ");
55+
int i = 0;
56+
while (token != NULL) {
57+
vertex_values[i++] = atoi(token);
58+
token = strtok(NULL, ", ");
59+
}
60+
}
61+
62+
int main(int argc, char* argv[]) {
63+
if (argc != 4 || !*argv[1] || !*argv[2] || !*argv[3]) {
64+
printf("Usage: please provide a tree in an adjacency matrix form (\"0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0\") together with a list of vertex values (\"1, 3, 5, 2, 4\") and the integer to find (\"4\")");
65+
return 1;
66+
}
67+
68+
char* matrix_str = argv[1];
69+
char* values_str = argv[2];
70+
int target = atoi(argv[3]);
71+
72+
int total_elements = 1;
73+
for (char* p = matrix_str; *p; p++) {
74+
if (*p == ',') total_elements++;
75+
}
76+
77+
num_nodes = (int)sqrt(total_elements);
78+
79+
parse_matrix(matrix_str);
80+
parse_values(values_str);
81+
82+
bool result = depth_first_search(target);
83+
printf(result ? "true\n" : "false\n");
84+
85+
return 0;
86+
}
87+

archive/c/c/testinfo.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ folder:
55
container:
66
image: "gcc"
77
tag: "8.3"
8-
build: "gcc -o {{ source.name }} {{ source.name }}{{ source.extension }}"
8+
build: "gcc -o {{ source.name }} {{ source.name }}{{ source.extension }} -lm"
99
cmd: "./{{ source.name }}"

0 commit comments

Comments
 (0)