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;
}
Beispiel #2
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;
}
Beispiel #3
0
	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;
		}
	}	
Beispiel #4
0
// 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;
}
Beispiel #5
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);
    }