Java Backtracking Algorithms: Sudoku, Knapsack, and Tasks

Classified in Computers

Written on in English with a size of 2.25 KB

Sudoku Solver Implementation

private boolean isValid(int r, int c, int n) {
  boolean valid = true;
  int sr, sc, fr, fc;
  for (int i = 0; i < 9 && valid; i++) {
    if (i != r) if (grid[i][c] == n) valid = false;
    if (i != c) if (grid[r][i] == n) valid = false;
  }
  if (valid) {
    sr = (r / 3) * 3; fr = sr + 3; sc = (c / 3) * 3; fc = sc + 3;
    for (int i = sr; i < fr && valid; i++) {
      for (int j = sc; j < fc && valid; j++) {
        if (grid[i][j] == n) valid = false;
      }
    }
  }
  return valid;
}

private boolean solveRec(int row, int col) {
  boolean solved = false;
  if (row == 9) solved = true;
  else {
    if (grid[row][col] == 0) {
      for (int i = 1; i < 10; i++) {
        if (isValid(row, col, i)) {
          grid[row][col] = i;
          solved = solveRec(col == 8 ? row + 1 : row, (col + 1) % 9);
          if (!solved) grid[row][col] = 0;
        }
      }
    } else {
      solved = solveRec(col == 8 ? row + 1 : row, (col + 1) % 9);
    }
  }
  return solved;
}

0/1 Knapsack Problem

public Knapsack01(double[] wi, double[] pi, double we) {
  optP = 0; w = wi; p = pi; maxW = we;
  nItems = w.length; optX = new int[nItems];
  x = new int[nItems];
  for (int i = 0; i < nItems; i++) x[i] = 0;
}

public void knapsack() { knapsack(0, 0.0); }

public int[] getSol() { return optX; }

public void knapsack(int l, double cW) {
  if (l == nItems) {
    double aux = 0.0;
    for (int i = 0; i < l; i++) aux += p[i] * x[i];
    if (aux > optP) {
      for (int i = 0; i < nItems; i++) optX[i] = x[i];
      optP = aux;
    }
  } else {
    if (cW + w[l] <= maxW) {
      x[l] = 1;
      knapsack(l + 1, cW + w[l]);
    }
    x[l] = 0;
    knapsack(l + 1, cW);
  }
}

Task Distribution Algorithm

public void taskDistribution(int level, int[] actual) {
  if (level == nTasks) {
    double prof = profit(actual);
    if (prof > maxProfit) {
      maxProfit = prof;
      for (int i = 0; i < nTasks; i++) solution[i] = actual[i];
    }
  } else {
    for (int i = 0; i < nTasks; i++) {
      if (valid(actual, level, i)) {
        actual[level] = i;
        taskDistribution(level + 1, actual);
      }
    }
  }
}

Related entries: