C :: Aufgabe #75 :: Lösung #1

1 Lösung Lösung öffentlich
#75

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.
#1
vote_ok
von devnull (8870 Punkte) - 28.12.2015 um 20:34 Uhr

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

Quellcode ausblenden C-Code
/************************************
 * 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;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2092673

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.