TYPED_TEST(HashTableTest, load_key_test) {
  field_list_t fields = {1, 2};
  pos_t row = 1;
  TypeParam htable(this->table, fields);
  auto key = GroupKeyHash<typename TypeParam::key_t>::getGroupKey(this->table, fields, fields.size(), row);
  auto pos_list = htable.get(key);
  EXPECT_EQ(pos_list.size(), 2u);
  EXPECT_TRUE(contains_all(pos_list, pos_list_t {0, 1}));
}
TYPED_TEST(HashTableTest, load) {
  field_list_t fields {1, 2};
  pos_t row {1};

  TypeParam htable(this->table, fields);
  auto pos_list = htable.get(this->table, fields, row);

  EXPECT_EQ(pos_list.size(), 2u);
  EXPECT_TRUE(contains_all(pos_list, pos_list_t {0, 1}));
}
TYPED_TEST(HashTableTest, get_pos_list) {
  field_list_t fields = {1, 2};

  TypeParam htable(this->table, fields);
  EXPECT_EQ(htable.size(), 5u);

  // For each line, we check that a line ends up in the right place
  for (size_t line = 0; line < this->table->size(); ++line) {
    auto pos_list = htable.get(this->table, fields, line);
    EXPECT_TRUE(contains_all(pos_list, pos_list_t {line}));
  }
}
Exemple #4
0
int main() {
    zdd_init();
    // The universe is {1, ..., 9^3 = 729}.
    zdd_set_vmax(729);
    // Number rows and columns from 0. Digits are integers [1..9].
    // The digit d at (r, c) is represented by element 81 r + 9 c + d.
    inta_t list;
    inta_init(list);
    for(int i = 0; i < 9; i++) {
        for(int j = 0; j < 9; j++) {
            int c = getchar();
            if (EOF == c) die("unexpected EOF");
            if ('\n' == c) die("unexpected newline");
            if (c >= '1' && c <= '9') {
                inta_append(list, 81 * i + 9 * j + c - '0');
            }
        }
        int c = getchar();
        if (EOF == c) die("unexpected EOF");
        if ('\n' != c) die("expected newline");
    }
    inta_append(list, -1);
    contains_all(inta_raw(list));
    inta_clear(list);

    global_one_digit_per_box();
    zdd_intersection();

    // Number of ways you can put nine 1s into a sudoku is
    //   9*6*3*6*3*4*2*2.
    printf("rows\n");
    fflush(stdout);
    for(int i = 1; i <= 9; i++) {
        for(int r = 0; r < 9; r++) {
            unique_digit_per_row(i, r);
            if (r) zdd_intersection();
        }
        zdd_intersection();
    }
    for(int i = 1; i <= 9; i++) {
        for(int c = 0; c < 3; c++) {
            for(int r = 0; r < 3; r++) {
                printf("3x3 %d: %d, %d\n", i, r, c);
                fflush(stdout);
                unique_digit_per_3x3(i, r, c);
                if (r) zdd_intersection();
            }
            if (c) zdd_intersection();
        }
        zdd_intersection();
    }
    for(int i = 1; i <= 9; i++) {
        for(int c = 0; c < 9; c++) {
            printf("cols %d: %d\n", i, c);
            fflush(stdout);
            unique_digit_per_col(i, c);
            if (c) zdd_intersection();
        }
        zdd_intersection();
    }

    void printsol(int *v, int vcount) {
        for(int i = 0; i < vcount; i++) {
            putchar(((v[i] - 1) % 9) + '1');
            if (8 == (i % 9)) putchar('\n');
        }
        putchar('\n');
    }
    zdd_forall(printsol);
    return 0;
}