#include #include #include typedef enum status { BOARD_INCOMP, BOARD_BAD, BOARD_GOOD } status; #define HEIGHT 5 // Odd number #define STARTW 3 // Width of first line < HEIGHT #define WIDTH ((2*HEIGHT)-1) #define PIECES (HEIGHT*HEIGHT-STARTW*(STARTW-1)) #define SEEKED ((PIECES*(PIECES+1))/(2*HEIGHT)) //#define EXITON1SOL exit(0); #ifdef EXITON1SOL #define FINALEXITCODE 1 #else #define FINALEXITCODE 0 #define EXITON1SOL #endif status CheckLine(int i, int board[HEIGHT][WIDTH]) { int j, sum=0, val, *b; status stat = BOARD_GOOD; b=&board[i][0]; for(j=0;j SEEKED) return BOARD_BAD; else if(sum == SEEKED && stat != BOARD_INCOMP) return BOARD_GOOD; return stat; } status CheckDiags(int ci, int cj, int board[HEIGHT][WIDTH]) { int i, j, sum, val, s; status lstat, stat = BOARD_GOOD; for (s=-1; s<=1; s+=2) { j = cj + s*ci; sum = 0; lstat = BOARD_GOOD; for(i=0;i=HEIGHT||j<0||j>=WIDTH) ; else if((val = board[i][j]) < 0) stat=lstat=BOARD_INCOMP; else sum += val; j-=s; } if(sum != SEEKED && lstat != BOARD_INCOMP) return BOARD_BAD; else if(sum > SEEKED) return BOARD_BAD; else if(sum == SEEKED && lstat != BOARD_INCOMP) stat = BOARD_GOOD; } return stat; } status CheckSums(int i, int j, int board[HEIGHT][WIDTH]) { if(CheckLine(i, board) == BOARD_BAD) return BOARD_BAD; return CheckDiags(i, j, board); } void FindNextFree(int *i, int *j, int board[HEIGHT][WIDTH]) { int dj=1+(*j>0); for(;*i maxv) { printf ("No solution (max value on first line is %d (seeked %d) !\n", maxv, SEEKED); exit(1); } printf("Seekeing solutions for %d pos. board (%d to %d), sum=%d\n", PIECES, STARTW, HEIGHT, SEEKED); } int main() { int board[HEIGHT][WIDTH]; int pieces[PIECES]; CheckProblem(); InitPieces(pieces); InitBoard(board); Recurse(1, 0, 0, board, pieces); exit(FINALEXITCODE); }