Exemplo n.º 1
0
        std::size_t solve_board(list_type const& list, std::size_t size,
            std::size_t level, std::size_t col)
        {

            board b(list, size, level);

            if(level == size){
                return 1;
            }
            else if(level == 0)
            {
                b.update_board(level, col);
                if(b.check_board( b.access_board(), level))
                {
                   b.count_+= solve_board( b.access_board(),
                                            size, level + 1, col);
                }
            }
            else
            {
                for(std::size_t i = 0; i < size; ++i)
                {
                    b.update_board(level,i);
                    if(b.check_board( b.access_board(), level))
                    {
                       b.count_+=  solve_board( b.access_board(),
                                                size, level+1, col);
                    }
                }
            }
            return b.count_;
        }
Exemplo n.º 2
0
void solve_board(board_t* board)
{
	stats.solve++;
	if (is_complete(board)) {
		printf("SOLVED!\n");
		print_board(board);
		print_stats(stats);
		assert(0);
	} else if (is_dead_end(board)) {
		debugf("dead end, skip\n");
	} else {
		size_t i_row, i_col;
		digits_t digits;
		find_next_continuation(board, &i_row, &i_col, &digits);
		debugf("best continuation [%lu,%lu]\n", i_row, i_col);
		size_t i;
		for (i = 1; i < NDIGITS; i++) {
			if (0 == digits.digits[i]) {
				debugf("extending [%lu,%lu] <- %lu\n", i_row, i_col, i);
				board_t* new_board = copy_board(board);
				set_digit(new_board, i_row, i_col, i);
				solve_board(new_board);
				free(new_board);
			}
		}
	}
}
Exemplo n.º 3
0
Arquivo: susol.c Projeto: zackb/code
int main(int argc, const char **argv) {
    if (argc != 2) 
        return usage();
    read_board(argv[1]);
    solve_board();
    print_board();
    return 0;
}
Exemplo n.º 4
0
int main() // int argc, char* argv)
{
	init_stats(&stats);
	board_t* board = new_board();
	if (false == load_board(board)) {
		printf("bad board\n");
	} else {
		printf("loaded board:\n");
		print_board(board);
		solve_board(board);
	}
//	print_board(board);
	return 0;
}
Exemplo n.º 5
0
Arquivo: susol.c Projeto: zackb/code
int solve_board() {
    // find the x and y to try
   int x, y;

    // see if the board has an empty space and set the x and y
    int empty = 0;
    for (x = 0; x < SIZE; x++) {
        for (y = 0; y < SIZE; y++) {
            if (board[x][y] == EMPTY) {
                empty = 1;
                break;
            }
        }
        if (empty == 1) break;
    }
    if (empty == 0) return 1;

    // track numbers already used in row and cols
    int numbers[SIZE + 1] = { 0 };
    for (int i = 0; i < SIZE; i++) {
        numbers[board[x][i]] = 1;
        numbers[board[i][y]] = 1;
    }

    // track numbers already used in the unit
    int ux = (x / 3) * 3;
    int uy = (y / 3) * 3;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            numbers[board[ux + i][uy + j]] = 1;

    // find unused numbers and see if they fit
    for (int i = 1; i <= SIZE; i++) {
        // find an available number
        if (numbers[i] == 0) {
            // see if it works
            board[x][y] = i;
            if (solve_board() == 1)
                return 1;
            // otherwise reset and try the next number
            board[x][y] = EMPTY;
        }
    }
    return 0;
}
Exemplo n.º 6
0
/*
 * Solves a board starting with the given cell. Returns 1 if the board could be
 * solved, 0 if not.
 */
int solve_board(struct board *b, int r, int c)
{
	int prev;
	int val;

	assert_(b != NULL &&
	       r >= MIN_NUM && r <= MAX_NUM &&
	       c >= MIN_NUM && c <= MAX_NUM);

	/* Base case: board solved, print it. */
	if (b->unset_cells == 0) {
		print_board(b);
		return 1;
	}

	/* Find the next unset cell. */
	while (is_set(b, r, c) && next_cell(&r, &c))
	       ;

	/* This should never happen. */
	if (is_set(b, r, c))
		return 1;

	/* Try every possible cell value until the board can be solved. */
	prev = MIN_NUM;
	while (1) {
		val = find_common_free(b->cells[r][c].row_candidates,
				       b->cells[r][c].col_candidates,
				       b->cells[r][c].square_candidates,
				       prev);
		if (val == -1)
			break;

		set_cell(b, r, c, val);
		if (solve_board(b, r, c))
			return 1;
		unset_cell(b, r, c, val);

		prev = val+1;
	}

	return 0;
}
Exemplo n.º 7
0
int main(int argc, char *argv[])
{
	FILE *in;
	struct board b;

	int ret;

	if (argc > 2) {
		fprintf(stderr, "ERROR: too many arguments\n");
		return 1;
	}

	if (argc == 2) {
		in = fopen(argv[1], "r");
		if (in == NULL) {
			fprintf(stderr, "ERROR: could not open \"%s\"\n", argv[1]);
			return 2;
		}
	} else {
		in = stdin;
	}

	/* Initialize data structures. */
	init_board(&b);

	/* Read and solve board. */
	read_board(in, &b);
	ret = solve_board(&b, MIN_NUM, MIN_NUM);

	/* Close input and return. */
	fclose(in);

	if (! ret)
		fprintf(stderr, "ERROR: board could not be solved\n");

	return (ret?0:3);
}
Exemplo n.º 8
0
static void sudoku_solve(void)
{
	completed=1;
	solve_board();
    sudoku_draw_board();
}