知识点
回溯
解题思路
可以从第一行开始放置牛,逐行进行探索。在每一行中,对于当前位置,我们检查是否可以放置一头牛。如果可以放置,我们就继续搜索下一行;如果不能放置,我们尝试下一个位置。直到在最后一行放置了一头牛。通过调用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;
}
}



京公网安备 11010502036488号