火柴棍摆正方形
题目:给定若干不同长度的火柴棍,要求判断这些火柴棍能不能围成正方形。
分析:如果总长不能被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)){