#4
by かずま » 6年前
では、経路を求めてみましょう。
まずは、すべての点を通る経路。
コード:
#include <stdio.h>
#define N 8
void print_matrix(int a[][N]);
int route[N], nr = 0, visit[N];
void dfs(int a[][N], int v) // depth first search
{
route[nr++] = v;
visit[v] = 1;
for (int i = N; --i; )
if (a[v][i] && !visit[i]) dfs(a, i);
if (nr == N) {
for (int i = 0; i < nr; i++) printf(" %d", route[i]);
putchar('\n');
}
visit[v] = 0;
nr--;
}
int main(void)
{
int a[N][N] = {
0, 1, 0, 1, 1, 0, 0, 0,
1, 0, 1, 0, 1, 1, 0, 1,
1, 1, 0, 0, 0, 1, 0, 1,
0, 1, 1, 0, 0, 0, 0, 1,
0, 0, 1, 1, 0, 0, 1, 0,
0, 1, 1, 0, 1, 0, 1, 1,
0, 0, 0, 0, 1, 0, 0, 1,
1, 1, 0, 1, 0, 0, 0, 0,
};
print_matrix(a);
dfs(a, 0);
}
void print_matrix(int a[][N]) //行列を表示する関数
{
int i, j;
printf(" ");
for (i = 0; i < N; i++) printf(" %d", i);
printf("\n +-----------------\n");
for (i = 0; i < N; i++) {
printf(" %d |", i);
for (j = 0; j < N; j++)
printf(" %d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
実行結果
コード:
0 1 2 3 4 5 6 7
+-----------------
0 | 0 1 0 1 1 0 0 0
1 | 1 0 1 0 1 1 0 1
2 | 1 1 0 0 0 1 0 1
3 | 0 1 1 0 0 0 0 1
4 | 0 0 1 1 0 0 1 0
5 | 0 1 1 0 1 0 1 1
6 | 0 0 0 0 1 0 0 1
7 | 1 1 0 1 0 0 0 0
0 4 6 7 3 2 5 1
0 4 6 7 3 2 1 5
0 4 6 7 3 1 5 2
0 4 6 7 3 1 2 5
0 4 3 7 1 2 5 6
0 4 3 2 7 1 5 6
0 4 3 2 5 6 7 1
0 4 3 2 1 5 6 7
0 4 3 1 2 5 6 7
0 4 2 7 3 1 5 6
0 4 2 5 6 7 3 1
0 4 2 1 5 6 7 3
0 3 7 1 5 6 4 2
0 3 7 1 4 2 5 6
0 3 7 1 2 5 6 4
0 3 7 1 2 5 4 6
0 3 2 7 1 5 6 4
0 3 2 7 1 5 4 6
0 3 2 5 7 1 4 6
0 3 2 5 6 7 1 4
0 3 2 5 4 6 7 1
0 3 2 5 1 4 6 7
0 3 2 1 5 4 6 7
0 3 1 5 6 4 2 7
0 3 1 4 2 5 6 7
0 3 1 2 5 4 6 7
0 1 7 3 2 5 6 4
0 1 7 3 2 5 4 6
0 1 5 6 4 3 2 7
0 1 5 6 4 2 7 3
0 1 5 4 6 7 3 2
0 1 4 6 7 3 2 5
0 1 4 3 2 5 6 7
0 1 4 2 5 6 7 3
0 1 2 5 6 4 3 7
0 1 2 5 4 6 7 3
次は行き詰まるまでのすべての経路
コード:
#include <stdio.h>
#define N 8
void print_matrix(int a[][N]);
int route[N], nr = 0, visit[N];
void dfs(int a[][N], int v) // depth first search
{
route[nr++] = v;
visit[v] = 1;
int next = 0;
for (int i = N; --i; )
if (a[v][i] && !visit[i]) dfs(a, i), next = 1;
if (next == 0) {
for (int i = 0; i < nr; i++) printf(" %d", route[i]);
putchar('\n');
}
visit[v] = 0;
nr--;
}
int main(void)
{
int a[N][N] = {
0, 1, 0, 1, 1, 0, 0, 0,
1, 0, 1, 0, 1, 1, 0, 1,
1, 1, 0, 0, 0, 1, 0, 1,
0, 1, 1, 0, 0, 0, 0, 1,
0, 0, 1, 1, 0, 0, 1, 0,
0, 1, 1, 0, 1, 0, 1, 1,
0, 0, 0, 0, 1, 0, 0, 1,
1, 1, 0, 1, 0, 0, 0, 0,
};
print_matrix(a);
dfs(a, 0);
}
void print_matrix(int a[][N]) //行列を表示する関数
{
int i, j;
printf(" ");
for (i = 0; i < N; i++) printf(" %d", i);
printf("\n +-----------------\n");
for (i = 0; i < N; i++) {
printf(" %d |", i);
for (j = 0; j < N; j++)
printf(" %d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
実行結果
コード:
0 1 2 3 4 5 6 7
+-----------------
0 | 0 1 0 1 1 0 0 0
1 | 1 0 1 0 1 1 0 1
2 | 1 1 0 0 0 1 0 1
3 | 0 1 1 0 0 0 0 1
4 | 0 0 1 1 0 0 1 0
5 | 0 1 1 0 1 0 1 1
6 | 0 0 0 0 1 0 0 1
7 | 1 1 0 1 0 0 0 0
0 4 6 7 3 2 5 1
0 4 6 7 3 2 1 5
0 4 6 7 3 1 5 2
0 4 6 7 3 1 2 5
0 4 6 7 1 5 2
0 4 6 7 1 2 5
0 4 3 7 1 5 6
0 4 3 7 1 5 2
0 4 3 7 1 2 5 6
0 4 3 2 7 1 5 6
0 4 3 2 5 7 1
0 4 3 2 5 6 7 1
0 4 3 2 5 1 7
0 4 3 2 1 7
0 4 3 2 1 5 7
0 4 3 2 1 5 6 7
0 4 3 1 7
0 4 3 1 5 7
0 4 3 1 5 6 7
0 4 3 1 5 2 7
0 4 3 1 2 7
0 4 3 1 2 5 7
0 4 3 1 2 5 6 7
0 4 2 7 3 1 5 6
0 4 2 7 1 5 6
0 4 2 5 7 3 1
0 4 2 5 7 1
0 4 2 5 6 7 3 1
0 4 2 5 6 7 1
0 4 2 5 1 7 3
0 4 2 1 7 3
0 4 2 1 5 7 3
0 4 2 1 5 6 7 3
0 3 7 1 5 6 4 2
0 3 7 1 5 4 6
0 3 7 1 5 4 2
0 3 7 1 5 2
0 3 7 1 4 6
0 3 7 1 4 2 5 6
0 3 7 1 2 5 6 4
0 3 7 1 2 5 4 6
0 3 2 7 1 5 6 4
0 3 2 7 1 5 4 6
0 3 2 7 1 4 6
0 3 2 5 7 1 4 6
0 3 2 5 6 7 1 4
0 3 2 5 6 4
0 3 2 5 4 6 7 1
0 3 2 5 1 7
0 3 2 5 1 4 6 7
0 3 2 1 7
0 3 2 1 5 7
0 3 2 1 5 6 7
0 3 2 1 5 6 4
0 3 2 1 5 4 6 7
0 3 2 1 4 6 7
0 3 1 7
0 3 1 5 7
0 3 1 5 6 7
0 3 1 5 6 4 2 7
0 3 1 5 4 6 7
0 3 1 5 4 2 7
0 3 1 5 2 7
0 3 1 4 6 7
0 3 1 4 2 7
0 3 1 4 2 5 7
0 3 1 4 2 5 6 7
0 3 1 2 7
0 3 1 2 5 7
0 3 1 2 5 6 7
0 3 1 2 5 6 4
0 3 1 2 5 4 6 7
0 1 7 3 2 5 6 4
0 1 7 3 2 5 4 6
0 1 5 7 3 2
0 1 5 6 7 3 2
0 1 5 6 4 3 7
0 1 5 6 4 3 2 7
0 1 5 6 4 2 7 3
0 1 5 4 6 7 3 2
0 1 5 4 3 7
0 1 5 4 3 2 7
0 1 5 4 2 7 3
0 1 5 2 7 3
0 1 4 6 7 3 2 5
0 1 4 3 7
0 1 4 3 2 7
0 1 4 3 2 5 7
0 1 4 3 2 5 6 7
0 1 4 2 7 3
0 1 4 2 5 7 3
0 1 4 2 5 6 7 3
0 1 2 7 3
0 1 2 5 7 3
0 1 2 5 6 7 3
0 1 2 5 6 4 3 7
0 1 2 5 4 6 7 3
0 1 2 5 4 3 7
では、経路を求めてみましょう。
まずは、すべての点を通る経路。
[code]
#include <stdio.h>
#define N 8
void print_matrix(int a[][N]);
int route[N], nr = 0, visit[N];
void dfs(int a[][N], int v) // depth first search
{
route[nr++] = v;
visit[v] = 1;
for (int i = N; --i; )
if (a[v][i] && !visit[i]) dfs(a, i);
if (nr == N) {
for (int i = 0; i < nr; i++) printf(" %d", route[i]);
putchar('\n');
}
visit[v] = 0;
nr--;
}
int main(void)
{
int a[N][N] = {
0, 1, 0, 1, 1, 0, 0, 0,
1, 0, 1, 0, 1, 1, 0, 1,
1, 1, 0, 0, 0, 1, 0, 1,
0, 1, 1, 0, 0, 0, 0, 1,
0, 0, 1, 1, 0, 0, 1, 0,
0, 1, 1, 0, 1, 0, 1, 1,
0, 0, 0, 0, 1, 0, 0, 1,
1, 1, 0, 1, 0, 0, 0, 0,
};
print_matrix(a);
dfs(a, 0);
}
void print_matrix(int a[][N]) //行列を表示する関数
{
int i, j;
printf(" ");
for (i = 0; i < N; i++) printf(" %d", i);
printf("\n +-----------------\n");
for (i = 0; i < N; i++) {
printf(" %d |", i);
for (j = 0; j < N; j++)
printf(" %d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
[/code]
実行結果
[code]
0 1 2 3 4 5 6 7
+-----------------
0 | 0 1 0 1 1 0 0 0
1 | 1 0 1 0 1 1 0 1
2 | 1 1 0 0 0 1 0 1
3 | 0 1 1 0 0 0 0 1
4 | 0 0 1 1 0 0 1 0
5 | 0 1 1 0 1 0 1 1
6 | 0 0 0 0 1 0 0 1
7 | 1 1 0 1 0 0 0 0
0 4 6 7 3 2 5 1
0 4 6 7 3 2 1 5
0 4 6 7 3 1 5 2
0 4 6 7 3 1 2 5
0 4 3 7 1 2 5 6
0 4 3 2 7 1 5 6
0 4 3 2 5 6 7 1
0 4 3 2 1 5 6 7
0 4 3 1 2 5 6 7
0 4 2 7 3 1 5 6
0 4 2 5 6 7 3 1
0 4 2 1 5 6 7 3
0 3 7 1 5 6 4 2
0 3 7 1 4 2 5 6
0 3 7 1 2 5 6 4
0 3 7 1 2 5 4 6
0 3 2 7 1 5 6 4
0 3 2 7 1 5 4 6
0 3 2 5 7 1 4 6
0 3 2 5 6 7 1 4
0 3 2 5 4 6 7 1
0 3 2 5 1 4 6 7
0 3 2 1 5 4 6 7
0 3 1 5 6 4 2 7
0 3 1 4 2 5 6 7
0 3 1 2 5 4 6 7
0 1 7 3 2 5 6 4
0 1 7 3 2 5 4 6
0 1 5 6 4 3 2 7
0 1 5 6 4 2 7 3
0 1 5 4 6 7 3 2
0 1 4 6 7 3 2 5
0 1 4 3 2 5 6 7
0 1 4 2 5 6 7 3
0 1 2 5 6 4 3 7
0 1 2 5 4 6 7 3
[/code]
次は行き詰まるまでのすべての経路
[code]
#include <stdio.h>
#define N 8
void print_matrix(int a[][N]);
int route[N], nr = 0, visit[N];
void dfs(int a[][N], int v) // depth first search
{
route[nr++] = v;
visit[v] = 1;
int next = 0;
for (int i = N; --i; )
if (a[v][i] && !visit[i]) dfs(a, i), next = 1;
if (next == 0) {
for (int i = 0; i < nr; i++) printf(" %d", route[i]);
putchar('\n');
}
visit[v] = 0;
nr--;
}
int main(void)
{
int a[N][N] = {
0, 1, 0, 1, 1, 0, 0, 0,
1, 0, 1, 0, 1, 1, 0, 1,
1, 1, 0, 0, 0, 1, 0, 1,
0, 1, 1, 0, 0, 0, 0, 1,
0, 0, 1, 1, 0, 0, 1, 0,
0, 1, 1, 0, 1, 0, 1, 1,
0, 0, 0, 0, 1, 0, 0, 1,
1, 1, 0, 1, 0, 0, 0, 0,
};
print_matrix(a);
dfs(a, 0);
}
void print_matrix(int a[][N]) //行列を表示する関数
{
int i, j;
printf(" ");
for (i = 0; i < N; i++) printf(" %d", i);
printf("\n +-----------------\n");
for (i = 0; i < N; i++) {
printf(" %d |", i);
for (j = 0; j < N; j++)
printf(" %d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
[/code]
実行結果
[code]
0 1 2 3 4 5 6 7
+-----------------
0 | 0 1 0 1 1 0 0 0
1 | 1 0 1 0 1 1 0 1
2 | 1 1 0 0 0 1 0 1
3 | 0 1 1 0 0 0 0 1
4 | 0 0 1 1 0 0 1 0
5 | 0 1 1 0 1 0 1 1
6 | 0 0 0 0 1 0 0 1
7 | 1 1 0 1 0 0 0 0
0 4 6 7 3 2 5 1
0 4 6 7 3 2 1 5
0 4 6 7 3 1 5 2
0 4 6 7 3 1 2 5
0 4 6 7 1 5 2
0 4 6 7 1 2 5
0 4 3 7 1 5 6
0 4 3 7 1 5 2
0 4 3 7 1 2 5 6
0 4 3 2 7 1 5 6
0 4 3 2 5 7 1
0 4 3 2 5 6 7 1
0 4 3 2 5 1 7
0 4 3 2 1 7
0 4 3 2 1 5 7
0 4 3 2 1 5 6 7
0 4 3 1 7
0 4 3 1 5 7
0 4 3 1 5 6 7
0 4 3 1 5 2 7
0 4 3 1 2 7
0 4 3 1 2 5 7
0 4 3 1 2 5 6 7
0 4 2 7 3 1 5 6
0 4 2 7 1 5 6
0 4 2 5 7 3 1
0 4 2 5 7 1
0 4 2 5 6 7 3 1
0 4 2 5 6 7 1
0 4 2 5 1 7 3
0 4 2 1 7 3
0 4 2 1 5 7 3
0 4 2 1 5 6 7 3
0 3 7 1 5 6 4 2
0 3 7 1 5 4 6
0 3 7 1 5 4 2
0 3 7 1 5 2
0 3 7 1 4 6
0 3 7 1 4 2 5 6
0 3 7 1 2 5 6 4
0 3 7 1 2 5 4 6
0 3 2 7 1 5 6 4
0 3 2 7 1 5 4 6
0 3 2 7 1 4 6
0 3 2 5 7 1 4 6
0 3 2 5 6 7 1 4
0 3 2 5 6 4
0 3 2 5 4 6 7 1
0 3 2 5 1 7
0 3 2 5 1 4 6 7
0 3 2 1 7
0 3 2 1 5 7
0 3 2 1 5 6 7
0 3 2 1 5 6 4
0 3 2 1 5 4 6 7
0 3 2 1 4 6 7
0 3 1 7
0 3 1 5 7
0 3 1 5 6 7
0 3 1 5 6 4 2 7
0 3 1 5 4 6 7
0 3 1 5 4 2 7
0 3 1 5 2 7
0 3 1 4 6 7
0 3 1 4 2 7
0 3 1 4 2 5 7
0 3 1 4 2 5 6 7
0 3 1 2 7
0 3 1 2 5 7
0 3 1 2 5 6 7
0 3 1 2 5 6 4
0 3 1 2 5 4 6 7
0 1 7 3 2 5 6 4
0 1 7 3 2 5 4 6
0 1 5 7 3 2
0 1 5 6 7 3 2
0 1 5 6 4 3 7
0 1 5 6 4 3 2 7
0 1 5 6 4 2 7 3
0 1 5 4 6 7 3 2
0 1 5 4 3 7
0 1 5 4 3 2 7
0 1 5 4 2 7 3
0 1 5 2 7 3
0 1 4 6 7 3 2 5
0 1 4 3 7
0 1 4 3 2 7
0 1 4 3 2 5 7
0 1 4 3 2 5 6 7
0 1 4 2 7 3
0 1 4 2 5 7 3
0 1 4 2 5 6 7 3
0 1 2 7 3
0 1 2 5 7 3
0 1 2 5 6 7 3
0 1 2 5 6 4 3 7
0 1 2 5 4 6 7 3
0 1 2 5 4 3 7
[/code]