C
Werde aber für mich persönlich nach dem Testat das Programm mit Speicherung als Binärzahlen umschreiben. Finde das wirklich gut die Idee
Noch einmal bedacht: das ist eigentlich nicht nötig, weil ich's schon getan habe.
Siehe:
/* so machst du's: */
typedef struct dt_sudoku
{
char moeglichk[9][9][10];
/* der Rest ist egal */
} sud;
/* so mach ich's: */
typedef struct dt_sudoku
{
/* short ist besser als int, hat auch immer mind. 2 Bytes */
short moeglichk[9][9];
} sud;
/* egal, wie man's macht, man muss nur die drei Makros anpassen ;)
Wenn ich recht verstanden habe, dann bedeutet '0' bei dir: unmöglich
und '1': möglich. moeglichk hat in der tiefsten Ebene 10 Elemente,
also eines zu viel. Afaik ist das nullte bei dir egal.
Also:
*/
#define MOEGL(POINTER, ZIFFER) \
(((POINTER)[ZIFFER]) == '1' ? 1 : 0)
/* um ZIFFER moeglich zu machen */
#define SETZEM(POINTER, ZIFFER) \
((POINTER)[ZIFFER] = '1')
/* um ZIFFER unmoeglich zu machen */
#define LOESCHEM(POINTER, ZIFFER) \
((POINTER)[ZIFFER] = '0')
/* weil die Sache mit ALLEM in der Zuweisung an ein Array nicht geht,
mache ich noch ein Makro, um alle M. zu setzen
*/
#define SETZEALLEM(POINTER) \
{ for (int i = 0; i < 10; i++) { (SETZEM(POINTER, i)); } }
/* in meinem Fall (mit ints) muss SETZEALLEM lauten: */
#define SETZEALLEM(INTEGER) \
((INTEGER) = 0x0377)
Nun ist es egal, ob du moeglichk deklarierst als int[][] oder char[][][], wenn du nur mehr die jeweiligen Makros verwendest. Wenn dein Professor fragt, warum du die Makros hast, sagst du einfach: weil's so klarer ist. Und wenn er nicht herschaut, änderst du die Deklaration von moeglichk und nimmst die anderen Makros. Sonst müsste man nichts am Code ändern, wenn du die Makros konsequent verwendet. Ein Aufruf sieht immer so aus:
MOEGL(sdk->moeglichk[1][2], 5)
/* sieht nach, ob im Feld (1,2) noch 5 möglich ist */
Wenn du's dann zum Laufen gebracht hast, wär's schön, wenn du mir eine Kopie geben könntest. (Ich brauche nämlich auch einen Sudoku-Löser, den ich verstehe, nur nicht so dringed wie du )