Esempio n. 1
0
int searchSolutions(int sudoku[SUDOKU_SIZE][SUDOKU_SIZE], int solutions[SUDOKU_SIZE][SUDOKU_SIZE]) {
    int i, j;
    int solutionsCount = 0;
    for (i = 0; i < SUDOKU_SIZE; i++) {
        for (j = 0; j < SUDOKU_SIZE; j++) {
            if (sudoku[i][j] > 0)
                continue;
            int seen[SUDOKU_SIZE];
            initArray(seen, SUDOKU_SIZE, 0);
            elementsInColumn(seen, sudoku, j);
            elementsInLine(seen, sudoku, i);
            elementsInRegion(seen, sudoku, i - (i % (SUDOKU_SIZE / 3)), j - (j % (SUDOKU_SIZE / 3)));
            int k = 0;
            for (k = 0; k < SUDOKU_SIZE; k++) {
                if (seen[k] == 0) {
                    solutions[i][j] += 1 << k + 1;
                    solutionsCount++;
                }
            }
        }
    }
    return solutionsCount;
}
	void OpenSMOKE_MatrixSparsityPattern::FindDependence()
	{
		const int max_length_int_vector = static_cast<int> (std::pow(2., 32.) - 1);

		if (is_dependence_available_ == true)
			return;

		is_dependence_available_ = true;

		ElementSparsityPattern *elem;
		number_elements_ = 0;
		max_elements_in_rows_ = 0;
		min_elements_in_rows_ = columns_;
		max_elements_in_cols_ = 0;
		min_elements_in_cols_ = rows_;

		number_equations_per_variable_ = new int[columns_ + 1];
		memset(number_equations_per_variable_, 0, (columns_ + 1)*sizeof(int));

		int maxRow, minRow;
		OpenSMOKE::OpenSMOKEVectorInt elementsInColumn(columns_);
		number_zeros_on_diagonal_ = 0;
		for (int row = 1; row <= rows_; row++)
		{
			maxRow = 0;
			minRow = 0;
			elem = element_row_[row];
			while (elem != 0)
			{
				elementsInColumn(elem->column)++;
				if (elem->column == row)
					number_zeros_on_diagonal_++;
				maxRow++;
				minRow++;
				number_elements_++;
				number_equations_per_variable_[elem->column]++;
				if (number_elements_ == max_length_int_vector)
					OpenSMOKE::FatalErrorMessage("MatrixSparsityPattern::FindDependence(): Too many element dependencies");

				elem = elem->next;
			}
			if (maxRow > max_elements_in_rows_)
			{
				max_elements_in_rows_ = maxRow;
				index_max_row_ = row;
			}
			if (minRow < min_elements_in_rows_)
			{
				min_elements_in_rows_ = minRow;
				index_min_row_ = row;
			}
		}

		max_elements_in_cols_ = elementsInColumn.Max(&index_max_col_);
		min_elements_in_cols_ = elementsInColumn.Min(&index_min_col_);
		number_zeros_on_diagonal_ = Min(rows_, columns_) - number_zeros_on_diagonal_;

		dependencies_ = new int *[columns_ + 1];
		dependencies_[0] = new int[number_elements_ + 1];
		dependencies_[1] = dependencies_[0];
		int *ptrInt = dependencies_[0] + 1;
		int *ivar = new int[columns_ + 1];
		memset(ivar, 0, (columns_ + 1)*sizeof(int));

		for (int var = 1; var < columns_; var++)
			dependencies_[var + 1] = dependencies_[var] + number_equations_per_variable_[var];
		for (int row = 1; row <= rows_; row++)
		{
			elem = element_row_[row];
			while (elem != 0)
			{
				ivar[elem->column]++;
				dependencies_[elem->column][ivar[elem->column]] = row;
				elem = elem->next;
			}
		}
		delete ivar;
		ptrInt = dependencies_[0] + 1;
		char *tempFunz = new char[rows_ + 1];
		char *tempVar = new char[columns_ + 1];
		memset(tempVar, 0, (columns_ + 1)*sizeof(char));
		ptr_derivatives_ = new int[columns_ + 1];
		int *tempDer = new int[columns_ + 1];

		int k;
		int ider = 1;
		int jder = 1;
		int kder;
		number_groups_ = 0;

		int var;
		while (1)
		{
			memset(tempFunz, 0, (rows_ + 1)*sizeof(char));

			for (var = 1; var <= columns_; var++)
			if (tempVar[var] == 0)
				break;

			if (var > columns_)
				break;

			tempVar[var] = 1;
			ptr_derivatives_[ider++] = var;
			number_groups_++;
			kder = 1;
			for (k = 1; k <= number_equations_per_variable_[var]; k++)
				tempFunz[dependencies_[var][k]] = 1;
			while (1)
			{
				for (var += 1; var <= columns_; var++)
				if (tempVar[var] == 0)break;
				if (var > columns_)
				{
					tempDer[jder++] = kder;
					break;
				}
				char no = 0;
				for (k = 1; k <= number_equations_per_variable_[var]; k++)
				{
					if (tempFunz[dependencies_[var][k]] == 1)
					{
						no = 1; break;
					}
				}
				if (no == 0)
				{
					for (k = 1; k <= number_equations_per_variable_[var]; k++)
						tempFunz[dependencies_[var][k]] = 1;
					tempVar[var] = 1;
					ptr_derivatives_[ider++] = var;
					kder++;
				}
			}
		}
		variable_in_group_ = new int *[number_groups_ + 1];
		number_variables_in_group_ = new int[number_groups_ + 1];
		var = 0;
		for (k = 1; k <= number_groups_; k++)
		{
			number_variables_in_group_[k] = tempDer[k];
			variable_in_group_[k] = &ptr_derivatives_[var];
			var += tempDer[k];
		}
		max_number_of_elements_ = rows_*columns_;

		delete tempFunz;
		delete tempVar;
		delete tempDer;

		// Additional analyses
		AnalyzeBand();
		CalculateDensity();
	}