#include <stdio.h>
#define NUM_NODES 8
#define TOTAL_EDGES 9
// グラフの隣接行列(元データ)
// graph[u][v] は、頂点uから頂点vへの有向辺の数を示します
int base_graph[NUM_NODES][NUM_NODES] = {
// 0 1 2 3 4 5 6 7 (移動先の頂点)
{ 0, 1, 1, 0, 0, 0, 0, 0 }, // 頂点0から 1, 2 へ
{ 0, 0, 0, 1, 0, 0, 0, 0 }, // 頂点1から 3 へ
{ 0, 0, 0, 0, 1, 0, 0, 0 }, // 頂点2から 4 へ
{ 0, 0, 0, 0, 0, 1, 0, 0 }, // 頂点3から 5 へ
{ 0, 0, 0, 0, 0, 0, 1, 0 }, // 頂点4から 6 へ
{ 0, 0, 0, 0, 0, 0, 0, 1 }, // 頂点5から 7 へ
{ 1, 0, 0, 0, 0, 0, 0, 0 }, // 頂点6から 0 へ
{ 0, 0, 1, 0, 0, 0, 0, 0 } // 頂点7から 2 へ(巡回を生み出すための辺)
};
int current_graph[NUM_NODES][NUM_NODES];
int path[TOTAL_EDGES + 1]; // 通った頂点の履歴を保存する配列
int route_count = 0;
// 深さ優先探索(DFS)による一筆書き探索関数
void find_eulerian_paths(int current_node, int edge_count) {
// すべての辺(9本)を通りきったら一筆書き成功
if (edge_count == TOTAL_EDGES) {
route_count++;
printf("ルート %d: ", route_count
); for (int i = 0; i <= TOTAL_EDGES; i++) {
if (i
< TOTAL_EDGES
) printf(" -> "); }
return;
}
// 次の移動先となる頂点を探索
for (int next_node = 0; next_node < NUM_NODES; next_node++) {
// 現在の頂点から次の頂点へ移動できる辺が残っているか
if (current_graph[current_node][next_node] > 0) {
// 辺を消費(通過フラグ)
current_graph[current_node][next_node]--;
path[edge_count + 1] = next_node;
// 再帰的に次のステップを探索
find_eulerian_paths(next_node, edge_count + 1);
// 状態を元に戻す(バックトラッキング)
current_graph[current_node][next_node]++;
}
}
}
int main(void) {
printf("グラフのサイズ: 頂点数 %d, 辺の総数 %d\n", NUM_NODES
, TOTAL_EDGES
); printf("--- 一筆書きルートの探索開始 ---\n\n");
// すべての頂点(0〜7)を始点として試す
for (int start_node = 0; start_node < NUM_NODES; start_node++) {
// ワーク用のグラフ配列に初期データをコピー
for (int i = 0; i < NUM_NODES; i++) {
for (int j = 0; j < NUM_NODES; j++) {
current_graph[i][j] = base_graph[i][j];
}
}
// 始点をセットして探索開始
path[0] = start_node;
find_eulerian_paths(start_node, 0);
}
printf("\n発見された一筆書きルートの総数: %d\n", route_count
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE5VTV9OT0RFUyA4CiNkZWZpbmUgVE9UQUxfRURHRVMgOQoKLy8g44Kw44Op44OV44Gu6Zqj5o6l6KGM5YiX77yI5YWD44OH44O844K/77yJCi8vIGdyYXBoW3VdW3ZdIOOBr+OAgemggueCuXXjgYvjgonpoILngrl244G444Gu5pyJ5ZCR6L6644Gu5pWw44KS56S644GX44G+44GZCmludCBiYXNlX2dyYXBoW05VTV9OT0RFU11bTlVNX05PREVTXSA9IHsKICAgIC8vIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgICjnp7vli5XlhYjjga7poILngrkpCiAgICB7IDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfSwgLy8g6aCC54K5MOOBi+OCiSAxLCAyIOOBuAogICAgeyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sIC8vIOmggueCuTHjgYvjgokgMyDjgbgKICAgIHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCB9LCAvLyDpoILngrky44GL44KJIDQg44G4CiAgICB7IDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwgLy8g6aCC54K5M+OBi+OCiSA1IOOBuAogICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwIH0sIC8vIOmggueCuTTjgYvjgokgNiDjgbgKICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LCAvLyDpoILngrk144GL44KJIDcg44G4CiAgICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgLy8g6aCC54K5NuOBi+OCiSAwIOOBuAogICAgeyAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwIH0gIC8vIOmggueCuTfjgYvjgokgMiDjgbjvvIjlt6Hlm57jgpLnlJ/jgb/lh7rjgZnjgZ/jgoHjga7ovrrvvIkKfTsKCmludCBjdXJyZW50X2dyYXBoW05VTV9OT0RFU11bTlVNX05PREVTXTsKaW50IHBhdGhbVE9UQUxfRURHRVMgKyAxXTsgLy8g6YCa44Gj44Gf6aCC54K544Gu5bGl5q2044KS5L+d5a2Y44GZ44KL6YWN5YiXCmludCByb3V0ZV9jb3VudCA9IDA7CgovLyDmt7HjgZXlhKrlhYjmjqLntKLvvIhERlPvvInjgavjgojjgovkuIDnrYbmm7jjgY3mjqLntKLplqLmlbAKdm9pZCBmaW5kX2V1bGVyaWFuX3BhdGhzKGludCBjdXJyZW50X25vZGUsIGludCBlZGdlX2NvdW50KSB7CiAgICAvLyDjgZnjgbnjgabjga7ovrrvvIg55pys77yJ44KS6YCa44KK44GN44Gj44Gf44KJ5LiA562G5pu444GN5oiQ5YqfCiAgICBpZiAoZWRnZV9jb3VudCA9PSBUT1RBTF9FREdFUykgewogICAgICAgIHJvdXRlX2NvdW50Kys7CiAgICAgICAgcHJpbnRmKCLjg6vjg7zjg4ggJWQ6ICIsIHJvdXRlX2NvdW50KTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBUT1RBTF9FREdFUzsgaSsrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQiLCBwYXRoW2ldKTsKICAgICAgICAgICAgaWYgKGkgPCBUT1RBTF9FREdFUykgcHJpbnRmKCIgLT4gIik7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLy8g5qyh44Gu56e75YuV5YWI44Go44Gq44KL6aCC54K544KS5o6i57SiCiAgICBmb3IgKGludCBuZXh0X25vZGUgPSAwOyBuZXh0X25vZGUgPCBOVU1fTk9ERVM7IG5leHRfbm9kZSsrKSB7CiAgICAgICAgLy8g54++5Zyo44Gu6aCC54K544GL44KJ5qyh44Gu6aCC54K544G456e75YuV44Gn44GN44KL6L6644GM5q6L44Gj44Gm44GE44KL44GLCiAgICAgICAgaWYgKGN1cnJlbnRfZ3JhcGhbY3VycmVudF9ub2RlXVtuZXh0X25vZGVdID4gMCkgewogICAgICAgICAgICAKICAgICAgICAgICAgLy8g6L6644KS5raI6LK777yI6YCa6YGO44OV44Op44Kw77yJCiAgICAgICAgICAgIGN1cnJlbnRfZ3JhcGhbY3VycmVudF9ub2RlXVtuZXh0X25vZGVdLS07CiAgICAgICAgICAgIHBhdGhbZWRnZV9jb3VudCArIDFdID0gbmV4dF9ub2RlOwoKICAgICAgICAgICAgLy8g5YaN5biw55qE44Gr5qyh44Gu44K544OG44OD44OX44KS5o6i57SiCiAgICAgICAgICAgIGZpbmRfZXVsZXJpYW5fcGF0aHMobmV4dF9ub2RlLCBlZGdlX2NvdW50ICsgMSk7CgogICAgICAgICAgICAvLyDnirbmhYvjgpLlhYPjgavmiLvjgZnvvIjjg5Djg4Pjgq/jg4jjg6njg4Pjgq3jg7PjgrDvvIkKICAgICAgICAgICAgY3VycmVudF9ncmFwaFtjdXJyZW50X25vZGVdW25leHRfbm9kZV0rKzsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIHByaW50Zigi44Kw44Op44OV44Gu44K144Kk44K6OiDpoILngrnmlbAgJWQsIOi+uuOBrue3j+aVsCAlZFxuIiwgTlVNX05PREVTLCBUT1RBTF9FREdFUyk7CiAgICBwcmludGYoIi0tLSDkuIDnrYbmm7jjgY3jg6vjg7zjg4jjga7mjqLntKLplovlp4sgLS0tXG5cbiIpOwoKICAgIC8vIOOBmeOBueOBpuOBrumggueCue+8iDDjgJw377yJ44KS5aeL54K544Go44GX44Gm6Kmm44GZCiAgICBmb3IgKGludCBzdGFydF9ub2RlID0gMDsgc3RhcnRfbm9kZSA8IE5VTV9OT0RFUzsgc3RhcnRfbm9kZSsrKSB7CiAgICAgICAgCiAgICAgICAgLy8g44Ov44O844Kv55So44Gu44Kw44Op44OV6YWN5YiX44Gr5Yid5pyf44OH44O844K/44KS44Kz44OU44O8CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTk9ERVM7IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE5VTV9OT0RFUzsgaisrKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X2dyYXBoW2ldW2pdID0gYmFzZV9ncmFwaFtpXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g5aeL54K544KS44K744OD44OI44GX44Gm5o6i57Si6ZaL5aeLCiAgICAgICAgcGF0aFswXSA9IHN0YXJ0X25vZGU7CiAgICAgICAgZmluZF9ldWxlcmlhbl9wYXRocyhzdGFydF9ub2RlLCAwKTsKICAgIH0KCiAgICBwcmludGYoIlxu55m66KaL44GV44KM44Gf5LiA562G5pu444GN44Or44O844OI44Gu57eP5pWwOiAlZFxuIiwgcm91dGVfY291bnQpOwoKICAgIHJldHVybiAwOwp9Cg==