回溯法实例

火柴棍摆正方形

题目:给定若干不同长度的火柴棍,要求判断这些火柴棍能不能围成正方形。
分析:如果总长不能被4整除,那么就不能摆成正方形,如果可以被四整除,我们再开始使用回溯算法递归判断。我们选择一个数组,表示四个桶,桶的深度是总长的四分之一,我们选择火柴棍放入桶里,如果长度超出则表示这种摆放方案不可选,取出并进行下一个桶的试探,当四个桶中火柴棍总长度相同并且火柴棍摆完,那么这就是一种可行的解。程序递归的部分递归每个火柴棍的摆放,每个火柴棍有四种摆放方案。

package com.luyi.DataStructures.nothing;



/**
 * 火柴摆正方形 已知一个数组,保存了N个火柴棍,问是否可以使用这N个火柴棍摆成一个正方形
 * @author 卢意
 * @create 2020-12-07 20:40
 */
public class Match {
   
	// 设置一个数组
	static int all = 0; // 总长度
	int flag = 0 ;// 1为可以组成正方形 0为不能
	int []w = new int[4]; // 定义一个火柴桶可以存放火柴的数量
	static int count = 0;
	public  void b() {
   
		int[] arr = new int[]{
   3,3,4,2,1,2,1};
		Match.sort(arr);
		for (int i = 0; i < arr.length; i++){
   
			System.out.print(arr[i]+" ");
			all+=arr[i];
		}
		System.out.println();
		if (all % 4 !=0){
   
			System.out.println("不能构成正方形");
			return;
		}else {
   
			bt(0,arr);
		}
		if (flag == 1){
   
			System.out.println("可以");
			System.out.println(count);
		}else {
   
			System.out.println("不能构成正方形");
		}
	}

	 void bt(int n, int[] arr){
    // n为第n根火柴
		for (int i = 0; i < 4; i++) {
   
			if (n == 7) {
   
				flag = 1;
				count++;
				break;
			}else {
   
				w[i] += arr[n]; // 第i号火柴桶+上该长度的火柴
				if (check(i)){
   
					bt(n+1,arr);
				}
				w[i] -= arr[n];
			}
		}
	}

	// 判断是否能够放入当前火柴桶
	public boolean check(int i){
   
		if(w[i] > all/4){
    // 商都超出正方形边长
			return false;
		}
		return true;
	}
	// 设置一个方法 将数组从大到小排序
	public static void sort (int a[]) {
   
		for (int i = 0; i < a.length - 1; i++){
   
			for (int j = 0; j < a.length -1 - i; j++){
   
				if(a[j] < a[j+1] )
				{
   
					int temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
				}
			}
		}
	}

	public static void main(String[] args) {
   
		Match match = new Match();
		match.b();
	}
}

N皇后问题

题目:大家常见的是八皇后问题,是N皇后问题的一种特殊情况。N皇后问题是指,在一个N*N的棋盘上,放置N个皇后,他们彼此不能处在相同行、列、对角线,求有多少种摆放方案。
分析:我们可以对N个皇后逐一放置,首先我们可以确定一行摆放一个皇后,每个皇后有N个可以摆放的位置,那么我们先假设第一个皇后放在第一行第一个位置,再判断第二个皇后的摆放,如果放在第二行第一个位置在同一列不符合条件,放在第二个位置是对角线也不符合条件,第三个位置就可以,所以放下这个皇后,接下来看第三个皇后的摆放,以此类推,每次判断不可摆放时,即剪去了这个分支。如果某次递归行数大于N,即棋盘摆满,方案可行,计数加一。

package com.luyi.DataStructures.nothing;

/**
 * N皇后问题
 * @author 卢意
 * @create 2020-12-07 22:00
 */
public class Nqueen {
   
	int arr[];
	static int count = 0;
	static int allNum = 0;
	Nqueen(int n){
   
		arr = new int[n];
	}

	// 下棋
	public void check(int n){
    // 表示第n个皇后
		allNum++;
		for (int i = 0; i < arr.length; i++){
   
			if (n == arr.length){
   
				print();
				return;
			}
			arr[n] = i;
			// 当放置第那个皇后到i列时 是否冲突
			if (judge(n)){
   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值