排兵布阵问题java语言回溯法_用回溯算法解决集合问题(Java实现)

1.1题目:组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2

输出:

[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

解决代码:

class Solution {

int n;

int k;

List> res = new LinkedList<>();

public List> combine(int n, int k) {

this.n = n;

this.k = k;

middleMeth(1,new LinkedList());

return res;

}

public void middleMeth(int temp,LinkedList list){

if(list.size() == k){

res.add(new LinkedList(list));

}

for(int i = temp; i < n + 1 ;++i){

list.add(i);

middleMeth(i + 1,list);

list.removeLast();

}

}

}

1.2题目:子集

给定一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排兵布阵问题可以用回溯法实现,具体步骤如下: 1. 定义一个二维数组board,表示棋盘,其中0表示空位,1表示士兵。 2. 实现一个合法性检查的方法isValid,检查当前位置是否能够放置士兵。 3. 实现一个排兵布阵的方法backtrack,该方法采用回溯法进行搜索。从第一行开始,遍历每个位置,如果该位置可以放置士兵,则放置士兵并进入下一行进行搜索;如果该位置不能放置士兵,则回溯到上一行重新选择位置。 4. 在搜索过程中,记录已经放置的士兵数量和位置,当放置的士兵数量等于目标数量时,表示找到了一种合法的排兵布阵方案。 5. 在主程序中调用排兵布阵方法backtrack,输出找到的所有合法方案。 下面是Java代码示例: ```java public class Backtracking { private int[][] board; // 棋盘 private int n; // 士兵数量 public void backtrack(int row, int count) { if (count == n) { // 找到一种合法方案 printBoard(); return; } for (int i = 0; i < n; i++) { if (isValid(row, i)) { // 当前位置能够放置士兵 board[row][i] = 1; backtrack(row + 1, count + 1); board[row][i] = 0; // 回溯 } } } private boolean isValid(int x, int y) { for (int i = 0; i < x; i++) { // 检查列 if (board[i][y] == 1) { return false; } } for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) { // 检查左上角 if (board[i][j] == 1) { return false; } } for (int i = x - 1, j = y + 1; i >= 0 && j < n; i--, j++) { // 检查右上角 if (board[i][j] == 1) { return false; } } return true; } private void printBoard() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } System.out.println(); } public static void main(String[] args) { Backtracking bt = new Backtracking(); bt.n = 4; bt.board = new int[bt.n][bt.n]; bt.backtrack(0, 0); } } ``` 该程序输出如下: ``` 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 ``` 以上就是用回溯法实现排兵布阵问题Java代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值