示例#1
0
void dlx_search(void) {
node_t *column_min, *column, *row, *node;
	cost++;
	if (header->right == header) {
		solutions++;
		printf("\n%s", grid_cells);
	}
	else {
		column_min = header->right;
		for (column = column_min->right; column != header; column = column->right) {
			if (column->rows < column_min->rows) {
				column_min = column;
			}
		}
		cover_column(column_min);
		for (row = column_min->bottom; row != column_min; row = row->bottom) {
			add_piece(row->row_node->piece, row->row_node->grid_origin);
			for (node = row->right; node != row; node = node->right) {
				cover_column(node->row_node->column);
			}
			dlx_search();
			for (node = row->left; node != row; node = node->left) {
				uncover_column(node->row_node->column);
			}
		}
		uncover_column(column_min);
	}
}
int main(void)
{
    // char filename[] = "sudo2.csv";
    // int matrix[VSIZE][HSIZE];
    // read_csv(filename, matrix);

    int matrix[VSIZE*HSIZE] =
        {
 // sums: 8, 9, 8,11, 7,10, 8, 5, 5
          0, 1, 0, 1, 0, 0, 0, 1, 0,
          1, 1, 1, 1, 1, 1, 1, 0, 1,
          1, 0, 0, 1, 0, 1, 1, 1, 0,
          1, 0, 1, 1, 0, 1, 1, 1, 0,
          1, 1, 1, 1, 0, 0, 0, 1, 1,
          1, 0, 1, 1, 1, 0, 1, 1, 1,
          0, 1, 0, 1, 1, 1, 1, 0, 0,
          0, 1, 0, 0, 1, 0, 0, 0, 0,
          1, 1, 1, 0, 0, 0, 1, 0, 0,
          0, 1, 1, 1, 1, 1, 1, 0, 1,
          1, 1, 1, 0, 0, 1, 1, 0, 0,
          0, 1, 0, 1, 1, 1, 0, 0, 1,
          0, 0, 0, 1, 1, 1, 0, 0, 0,
          0, 0, 0, 0, 0, 1, 0, 0, 0,
          1, 0, 1, 1, 0, 1, 0, 0, 0
        };

    list sparse_matrix = create_sparse(VSIZE, HSIZE, matrix);
    list column;

    DEBUG_PRINT(1, "Check choosing column with min data.\n");
    column = choose_column_with_min_data(sparse_matrix, VSIZE + 1); // VSIZE + 1 is an arbitrary number >= min
    // print_sparse_matrix_transpose(sparse_matrix, VSIZE);
    // printf("----------\n");
    assert(get_data(column)->data == 5);                            // should have sum for 2nd-last column

    DEBUG_PRINT(1, "Check covering first column.\n");
    column = get_right(sparse_matrix);
    cover_column(column);
    // new column sums: 5,1,5,5,5,2,1,2
    // print_sparse_matrix_transpose(sparse_matrix, VSIZE);
    // printf("----------\n");
    assert(get_data(get_right(sparse_matrix))->data == 5);              // sum for first column
    assert(get_data(get_left(sparse_matrix))->data == 2);               // sum for last column
    assert(get_data(get_right(get_right(sparse_matrix)))->data == 1);   // sum for second column
    assert(get_data(get_left(get_left(sparse_matrix)))->data == 1);     // sum for 2nd-last column

    DEBUG_PRINT(1, "Check uncovering first column.\n");
    uncover_column(column);
    // print_sparse_matrix_transpose(sparse_matrix, VSIZE);
    assert(get_data(get_right(sparse_matrix))->data == 8);              // sum for first column
    assert(get_data(get_left(sparse_matrix))->data == 5);               // sum for last column
    assert(get_data(get_right(get_right(sparse_matrix)))->data == 9);   // sum for second column
    assert(get_data(get_left(get_left(sparse_matrix)))->data == 5);     // sum for 2nd-last column

    // printf("----------\n");
    // translate_into_constraint_matrix(matrix, constraints);
    // translate_into_sparse_constraints(constraints, sparse);
    // print_array(VSIZE, HSIZE, matrix);
    destroy_entire_grid(sparse_matrix);
    DEBUG_PRINT(0, "Passed all tests!\n");
    return 0;
}