知识点

回溯

解题思路

可以从第一行开始放置牛,逐行进行探索。在每一行中,对于当前位置,我们检查是否可以放置一头牛。如果可以放置,我们就继续搜索下一行;如果不能放置,我们尝试下一个位置。直到在最后一行放置了一头牛。通过调用totalNow方法并传入牛的数量n,即可获取不同方案的数量。

Java题解

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return int整型
     */
    public int totalNCow(int n) {
        if (n <= 0) {
            return 0;
        }

        int[] count = new int[1]; // 用于记录方案数量的计数器

        backtrack(0, new int[n], count);

        return count[0];
    }

    private void backtrack(int row, int[] placement, int[] count) {
        int n = placement.length;

        // 如果已经在最后一行放置了一头牛,说明找到了一个有效的方案
        if (row == n) {
            count[0]++;
            return;
        }

        // 在当前行的每一个位置尝试放置一头牛
        for (int col = 0; col < n; col++) {
            if (canPlace(row, col, placement)) {
                placement[row] = col; // 在当前位置放置一头牛

                // 继续搜索下一行
                backtrack(row + 1, placement, count);

                placement[row] = 0; // 恢复当前位置为空
            }
        }
    }

    private boolean canPlace(int row, int col, int[] placement) {
        // 检查当前位置的列和对角线是否没有其他牛
        for (int i = 0; i < row; i++) {
            if (placement[i] == col || Math.abs(row - i) == Math.abs(col - placement[i])) {
                return false;
            }
        }

        return true;
    }
}