|
| 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 | + |
0 commit comments