スポンサーリンク
隣接リスト
今回は、上記の経路(有向グラフ)を、隣接リストで表現します。
#define ROW 6 #define COL 3 int pathList[ROW][COL] = { {0}, {2, 3, 0}, {4, 0}, {6, 0}, {5, 0}, {0} };
スポンサーリンク
深さ優先探索
深さ優先探索は、行き止まりに到達するまで、先に先に経路を進めるイメージです。
再起を使うとシンプルに書けてしまいます。
dfs()の引数で、スタート地点とゴール地点を設定します。
通過した地点は、配列route[地点]の要素に1を代入します。
ゴール地点まで到達したら、Found targetと表示します。
あとは、次の地点の経路をdfs()の引数に設定して、dfs()自身を再帰呼び出しします。
void dfs(int start, int target){ int i; route[start] = 1; printf("%d→", start); if(start == target){ printf("Found target"); return; } for(i = 0; pathList[start][i] != 0; i++){ if(route[pathList[start][i]] == 0){ dfs(pathList[start][i], target); } } }
サンプルコード
下記がサンプルコードになります。
$ cat sample.c #include #define ROW 6 #define COL 3 int pathList[ROW][COL] = { {0}, {2, 3, 0}, {4, 0}, {6, 0}, {5, 0}, {0} }; int route[ROW]; void initRoute(){ int i; for(i = 0; i < ROW; i++){ route[i] = 0; } return; } void dfs(int start, int target){ int i; route[start] = 1; printf("%d→", start); if(start == target){ printf("Found target"); return; } for(i = 0; pathList[start][i] != 0; i++){ if(route[pathList[start][i]] == 0){ dfs(pathList[start][i], target); } } } int main(){ initRoute(); dfs(1, 6); return 0; }
下記が実行結果になります。
$ gcc -o sample sample.c $ ./sample 1→2→4→5→3→6→Found target
スポンサーリンク