LD=ld
CFLAGS=-Wall -O2 -g
-SUDOKUSOLVER_OBJS= solver.o sudoku.o
+SOLVER_OBJS= solver.o sudoku.o random.o
+GENERATOR_OBJS= generator.o sudoku.o random.o
-all: sudokusolver
+all: sudokusolver sudokugenerator
-sudokusolver: $(SUDOKUSOLVER_OBJS)
- $(CC) $(SUDOKUSOLVER_OBJS) -o sudokusolver
+sudokusolver: $(SOLVER_OBJS)
+ $(CC) $(SOLVER_OBJS) -o sudokusolver
-.cpp.o:
+sudokugenerator: $(GENERATOR_OBJS)
+ $(CC) $(GENERATOR_OBJS) -o sudokugenerator
+
+cpp.o:
$(CC) -MMD -MF .$@.d $(CFLAGS) -c $< -o $@
clean:
--- /dev/null
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "random.h"
+
+#define RAND_BUF_SIZE 1024
+#define RND_DEV "/dev/urandom"
+
+int get_random(void)
+{
+ static int rndbuf[RAND_BUF_SIZE];
+ static int index = RAND_BUF_SIZE;
+ int fd, error, i = 0, ret;
+
+ if (index < RAND_BUF_SIZE)
+ return rndbuf[index++];
+
+ fd = open(RND_DEV, O_RDONLY);
+ if (fd < 0) {
+ error = errno;
+ fprintf(stderr, "Error opening file %s: %s\n",
+ RND_DEV, strerror(error));
+ return -1;
+ }
+
+ do {
+ ret = read(fd, rndbuf + i,
+ RAND_BUF_SIZE * (sizeof(rndbuf[0]) - i));
+
+ if (ret <= 0) {
+ error = errno;
+ fprintf(stderr, "Error reading file %s: %s\n",
+ RND_DEV, strerror(error));
+ goto out;
+ }
+
+ i += ret;
+ } while (i < RAND_BUF_SIZE * sizeof(rndbuf[0]));
+ out:
+ close(fd);
+}
#define SUDOKU_H
#include <vector>
+#include <string>
extern int verbose;
std::string get_legal_numbers(const int col, const int row);
sudoku solve(int &solvable);
- std::vector<sudoku> solve_all();
+ std::vector<sudoku> solve_all(void);
+ void generate(int min_guesses);
int recursion_depth;
int guesses;