int main() { fin = fopen("wissqu.in", "r"); fout = fopen("wissqu.out", "w"); int i, j; for (i = 1; i <= 4; i++) fscanf(fin, "%s", map[i] + 1); for (i = 1; i <= 4; i++) for (j = 1; j <= 4; j++) cow[map[i][j]]++; cow['D']++; cow['C']--; for (i = 1; i <= 4; i++) for (j = 1; j <= 4; j++) if (can_put('D', i, j)) { if (is_print) ans[0] = (struct Point){'D', i, j}; char t = map[i][j]; map[i][j] = 'D'; cow['D']--; vis[i][j] = 1; dfs(1); vis[i][j] = 0; cow['D']++; map[i][j] = t; } fprintf(fout, "%d\n", cnt); return 0; }
static int caculate_hint(board_t board, color_t who) { int i, j, count = 0; for (i = 1; i <= 8; i++) for (j = 1; j <= 8; j++) { if (board[i][j] == HINT) board[i][j] = NONE; if (can_put(board, who, i, j)) { board[i][j] = HINT; ++count; } } return count; }
void get_max(vector<box> &boxes, vector<bool> &visited, vector<box> &solution, int &max) { bool found = false; for (int i = 0; i<boxes.size(); i++) { if (false == visited[i] && can_put(solution, boxes[i])) { visited[i] = true; solution.push_back(boxes[i]); get_max(boxes, visited, solution, max); solution.pop_back(); visited[i] = false; if (false == found) found = true; } } if (false == found) { int sum = 0; for (int i = 0; i<solution.size(); i++) sum+= solution[i].height; if (sum > max) max = sum; } }
// solve using backtracking void solve(int sudoku[BOARD_SIZE][BOARD_SIZE]) { int x, y, i; if (!next_empty(sudoku, &x, &y)) { return; } for (i=1; i<10; i++) { if (can_put(sudoku, x, y, i)) { sudoku[x][y] = i; solve(sudoku); int a, b; if (!next_empty(sudoku, &a, &b)) { // solution found return; } } } // solution not found, backtrack sudoku[x][y] = 0; }
bool rec( Int sr, Int sc ) { if ( sr >= in->N ) { if ( sc > 0 ) { for ( int r = 0; r < in->N; ++ r ) { if ( in->EG[r][sc - 1] < D[r][sc - 1] ) return false; } // cout << "D: " << endl; show_table(D); } return rec(0, sc + 1); } if ( sc > in->M ) { if ( mines <= limit && remains == 0 ) { // cout << "clear info: " << mines << " | " << remains << endl; // cout << "clear d: " << endl; show_table(D); show_table(in->EG); } // cout << "mines = " << mines << endl; // cout << "D: " << endl; // cout << "mines = " << mines << " / remains = " << remains << endl; return mines <= limit && remains == 0; } // put if can put // cout << "@rec: sr = " << sr << ", " << sc << endl; // show_table(D); if ( remains && mines < limit && can_put(sr, sc) ) { // cout << "@rec: can_put: " << sr << ", " << sc << " | mines = " << mines << ", remains = " << remains << endl; // show_table(D); put(sr, sc, 1); // show_table(D); // cout << "after put" << endl << endl; mines ++; if ( rec(sr + 1, sc) ) return true; mines --; put(sr, sc, -1); // cout << "@rec: unset: " << sr << ", " << sc << " | mines = " << mines << ", remains = " << remains << endl; } // no put return rec(sr + 1, sc); }