C :: Aufgabe #75
1 Lösung
Das ist das Haus vom Nikolaus
Anfänger - C
von eulerscheZhl
- 12.03.2015 um 10:20 Uhr
Schreibe ein Programm, das alle Lösungen des Haus vom Nikolaus findet.
Lösungen:
Konsolenausgabe:
$ ./nikolaus
Weg #01 : 1-2-3-4-5-3-1-4-2
Weg #02 : 1-2-3-4-1-3-5-4-2
Weg #03 : 1-2-3-5-4-1-3-4-2
...
Weg #42 : 1-4-3-1-2-4-5-3-2
Weg #43 : 1-4-3-2-4-5-3-1-2
Weg #44 : 1-4-3-2-1-3-5-4-2
/************************************
* nikolaus.c Haus vom Nikolaus
************************************/
#include <stdio.h>
#include <string.h>
/*
* 5
* +
* / \
* / \
* / \
* 4 +-----+ 3
* | |
* | |
* 1 +-----+ 2
*/
/* Struktur fuer Ecken und ihre Nachbarn */
typedef struct _corner {
int ends[4];
} corner_t;
corner_t corners[5] = {
{{2, 3, 4, 0}},
{{3, 4, 1, 0}},
{{4, 5, 1, 2}},
{{5, 1, 2, 3}},
{{3, 4, 0, 0}}};
/* Array fuer Kantenbelegung
* 0: Kante ist noch frei,
* 1: Kante wurde schon gezogen */
int edges[5][5];
/* rekursive Funktion zur Wegsuche im Graphen */
void traverse(int start) {
static int corner_stack[9];
static int corner_index = 0;
static int path_count = 0;
int c,i,j,k,end;
i = start-1;
corner_stack[corner_index] = start;
for (k=0; k<4; k++) {
end = corners[i].ends[k];
if (end > 0) {
j = end-1;
if (edges[i][j] == 0) {
edges[i][j] = edges[j][i] = 1;
corner_stack[++corner_index] = end;
if (corner_index == 8) {
path_count++;
printf("Weg #%02d : ", path_count);
for (c=0; c<=8; c++)
printf("%d%c", corner_stack[c], (c<8)?'-':'\n');
}
else {
traverse(end);
}
--corner_index;
edges[i][j] = edges[j][i] = 0;
}
}
}
}
/* main */
int main(void)
{
memset(edges, 0, 25*sizeof(int));
traverse(1);
return 0;
}
