回溯

96 阅读1分钟
  1. 输出C(n, k)组合

var combine = function(n, k) {
    let arr = [], ans = [], tmp = [];

    for (let i = 0; i < n; i++) {
        arr.push(i+1);
    }
    
    function subCNK(startIndex, num) {
        if (num == 0) {
            ans.push([...tmp]);
            return;
        } else {
            //可以选择不放入当前num
            if (arr.length - startIndex > num) {
                subCNK(startIndex + 1, num);
            }
            tmp.push(arr[startIndex]);
            subCNK(startIndex + 1, num-1);
            tmp.pop();
        }
        
    }
    subCNK(0, k);
    return ans;
}
  1. 数独
/**
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var solveSudoku = function(board) {
    function ifInRow(num, i) {
        for (var r = 0; r < 9; r++) {
            if (board[i][r] == num) return true;
        }
        return false;
    }

    function ifInColumn(num, j) {
        for (var c = 0; c < 9; c++) {
            if (board[c][j] == num) return true;
        }
        return false;
    }

    function ifInBox(num, currentX, currentY) {
        var startX = Math.floor(currentX / 3) * 3,
            startY = Math.floor(currentY / 3) * 3;
            
        for (var x = startX; x < startX + 3; x++) {
            for (var y = startY; y < startY + 3; y++) {
                if (board[x][y] == num) return true;
            }
        }
        return false;
    }

    function solve(index) {
        if (index >= 81) {
            return true;
        }
        var x = Math.floor(index / 9),
            y = Math.floor(index % 9);
        if (board[x][y] != '.') {
            return solve(index+1);
        } else {
            for (var k = 1; k < 10; k++) {
                if (!ifInRow(k, x) && !ifInColumn(k, y) && !ifInBox(k, x, y)) {
                    board[x][y] = k + '';
                    var result = solve(index + 1);
                    if (result) return true;
                    board[x][y] = '.';
                }
            }
            return false;
        }
    }

    solve(0);
};