やりたいこと
C言語でのバックトラック法の経路探索について勉強しています。
下に示すソースコードの実行結果を
文字数の小さい順番に並び替えることはできますか?
ソースコードは以下のサイトを参考にしたものです。
http://www.nct9.ne.jp/m_hiroi/linux/clang16.html
#include <stdio.h> #include <stdbool.h> enum {S, A, B, C, D, E, F, G}; #define N 7 #define M 4 // 隣接リスト int adjacent[N + 1][M] = { {S}, {B, C, S}, {A, C, D, S}, {A, B, E, S}, {B, E, F, S}, {C, D, G, S}, {D, S}, {E, S}, }; // 経路 int path[N]; bool visited[N + 1]; // 経路の表示 void print_path(int n) { for (int i = 0; i < n; i++) printf("%c ", 'A' + path[i] - 1); printf("\n"); } // 深さ優先探索 void dfs(int n, int goal) { int x = path[n - 1]; if (x == goal) { print_path(n); } else { for (int i = 0; i < M; i++) { int y = adjacent[x][i]; if (y == 0) break; if (!visited[y]) { path[n] = y; visited[y] = true; dfs(n + 1, goal); visited[y] = false; } } } } int main(void) { path[0] = A; visited[A] = true; dfs(1, G); return 0; }
実行結果
A B C E G A B D E G A C B D E G A C E G
試したこと
文字列を他の文字列の配列に格納して、
その文字列で昇順にできるか試しました。
出来ませんでした。
他の探索方法を用いれば、文字列を並び替えることなく昇順の結果を実行出来ることは認識しております。
ただ、今回は出来ればバックトラック法を活用できたらよいなと考えています。
プログラミング言語初心者ですので、そもそもこのソースコードで文字の並び替えが可能なのかすらわかりません。
出来ないようでしたら、諦めて別の探索方法を用いるつもりです。
拙い文章ですが、ご協力いただけると幸いです。