示例#1
0
void find_next_continuation(const board_t* board, size_t* i_row, size_t* i_col,
							digits_t* digits) {
	size_t i, j, best_row, best_col;
	digits_t tmp_digits, best_digits;
	int min_possibilities = NO_MOVE_POSSIBLE;
	for (i = 0; i < NROWS; i++) {
		for (j = 0; j < NCOLS; j++) {
			if (EMPTY == get_digit(board, i, j)) {
				count_digits(board, i, j, &tmp_digits);
				int n_possible = count_possibilities(&tmp_digits);
				assert(n_possible > 0);
				assert(n_possible < NDIGITS);
				if (n_possible < min_possibilities) {
					min_possibilities = n_possible;
					best_row = i;
					best_col = j;
					best_digits = tmp_digits;
				}
			}
		}
	}
	assert(min_possibilities != NO_MOVE_POSSIBLE);
	memcpy(digits, &best_digits, sizeof(digits_t));
	*i_row = best_row;
	*i_col = best_col;
}
示例#2
0
bool is_dead_end(const board_t* board)
{
	size_t i, j;
	bool dead_end = false;
	for (i = 0; (i < NROWS) && (!dead_end); i++) {
		for (j = 0; (j < NCOLS) && (!dead_end); j++) {
			field_t value = get_digit(board, i, j);
			debugf("[%u,%u] == %d\n", i, j, value);
			if (EMPTY == value) {
				digits_t digits;
				count_digits(board, i, j, &digits);
				int n_possibilities = count_possibilities(&digits);
				if (0 == n_possibilities) {
					dead_end = true;
					debugf("[%lu,%lu] = %d, dead end\n", i, j, value);
				}
			}
		}
	}
	return dead_end;
}
示例#3
0
static int try_possibility(char pattern[9][9], char possibilities[9][9][9]) {
	int iterations = 0;
	bool solved = false;
	
	int lowestx = 0;
	int lowesty = 0;
	int lowest = 9;
	
	for (int x = 0; x < 9; x++) {
		for (int y = 0; y < 9; y++) {
			if (pattern[x][y] == ' ') {
				if (lowest > count_possibilities(possibilities, x, y)) {
					lowest = count_possibilities(possibilities, x, y);
					lowestx = x;
					lowesty = y;
				}
			}
		}
	}
	
	if (lowest != 9) {
		while ((lowest > 0) && (!solved)) {
			iterations++;
			
			char testpattern[9][9];
			char testpossibilities[9][9][9];
			
			bool loadprob = false;
			
			for (int x = 0; x < 9; x++) {
				for (int y = 0; y < 9; y++) {
					testpattern[x][y] = pattern[x][y];
					for (int z = 0; z < 9; z++) {
						testpossibilities[x][y][z] = possibilities[x][y][z];
						if ((x == lowestx) && (lowesty == y) && (possibilities[x][y][z] != ' ') && (!loadprob)) {
							testpattern[x][y] = possibilities[x][y][z];
							possibilities[x][y][z] = ' ';
							testpossibilities[x][y][z] = ' ';
							loadprob = true;
						}
					}
				}
			}
			printf("\n===\n");
			print_pattern(testpattern);
			printf("\n===\n");
			switch(check_solved_legal(testpattern)) {
				case 1 :
					solved = true;
					print_pattern(testpattern);
					printf("\nSolved!\n");
					printf("\nIterations: %d\n", iterations);
					end = clock();
					time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
					printf("\nTime to run: %f\n", time_spent);
					exit(EXIT_SUCCESS);
					return iterations;
				case -1 :
					printf("\nillegal moves\n");
					break;
				case 0 :
					iterations += try_possibility(testpattern, testpossibilities);
			}
			
			lowest--;
		}
		
	}
	return iterations;
}