算法设计(一)

1.汉诺塔

介绍

汉诺塔(Hanoi Tower) :它描述了如何将一堆大小不同、穿在一根柱子上的盘子移动到另一根柱子上,同时满足以下规则:

每次只能移动一个盘子。

每个移动盘子时,大的盘子不能放在小的盘子上面。

可以使用一根额外的柱子作为辅助。

算法实现

xml 复制代码
package com.practice.java;

import java.util.Scanner;

public class Example1 {
	//移动次数
	public static int val(int m) {
		int num;
		if(m == 1) {
			num = 1;
		}else {
			num = 2 * val(m - 1) + 1;
		}
		return num;
	}
	//移动过程
	public static void Hannoi(int n,char A,char B,char C) {
		if(n == 1) {
			move(1,A,C);
		}else {
			Hannoi(n-1,A,C,B);
			move(n,A,C);
			Hannoi(n-1,B,A,C);
		}
	}
	private static void move(int i, char x, char y) {
		System.out.println("把" + i + "号盘子从" + x + "移动到" + y);
	}
	public static void main(String[] args) {
		int num = 0;
		System.out.print("请输入需要移动盘子的数量: ");
		Scanner scanner = new Scanner(System.in);
		num = scanner.nextInt();
		if(num == 0) {
			System.out.println("输入的数量必须大于0!");
		}else {
			System.out.println("一共需要移动:" + val(num) + "次");
			System.out.println("移动过程如下:");
			Hannoi(num,'A','B','C');
		}
		scanner.close();
	}

}

2.斐波那契数列

介绍

斐波那契数列(Fibonacci sequence) 又称黄金分割数列 ,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称"兔子数列",其数值为:1、1、2、3、5、8、13、21、34......在数学上,这一数列以如下递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。

算法实现

xml 复制代码
package com.practice.java;

import java.util.Scanner;
public class Example2 {
	public static int fib(int n) {
		int f = 0;
		if(n == 0) {
			return 0;
		}
		if(n == 1) {
			return 1;
		}
		f = fib(n-2) + fib(n -1);
		return f;
	}

	public static void main(String[] args) {
		int n,m = 0;
		System.out.print("请输入一个整数: ");
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		m = fib(n);
		System.out.print("第" + n + "项是:" + m);
		m = 0;
		for(int i = 1;i <= n;i++) {
			m += fib(i);
		}
		System.out.println("前" + n + "项和是:" + m);
		scanner.close();
	}
}

3.八皇后

介绍

八皇后:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上

算法实现

xml 复制代码
package com.practice.java;
public class Example3 {
	static int Num = 0;//统计方案个数
	static boolean c[] = new boolean[9];//判断当列是否可放皇后
	static boolean L[] = new boolean[17];//判断左对角线是否可放皇后
	static boolean R[] = new boolean[17];//判断右对角线是否可放皇后

	static final int Normalize = 9;        //统一数组下标为正数             
	static int Queen[] = new int[9];       //标记皇后
	
	public static void check(int i) {
		for(int j = 1;j <= 8;j++) {
			if ((c[j] == true) && (L[i - j + Normalize] == true) && (R[i + j] == true)){//表示i行j列可放
				Queen[i] = j;
				c[j] = false;
				L[i -j + Normalize] = false;
				R[i + j] = false;
				if(i < 8) {//继续放置皇后
					check(i + 1);
				}else {//放完八个皇后
					Num++;
					System.out.println("方案" + Num +":");
					for(int k = 1;k <= 8;k++) {
						System.out.print(k + "行" + Queen[k] +"列" + "  ");
					}
					System.out.println();
				}
				c[j] = true;
				L[i -j + Normalize] = true;
				R[i + j] = true;
			}	
		}
	}
	public static void main(String[] args) {
		for(int i = 1;i < 9;i++) {
			c[i] = true;
		}
		for(int i = 0;i < 17;i++) {
			L[i] = R[i] = true;
		}
		check(1);			
	}
}


感谢大家的支持,关注,评论,点赞!
再见!!!

相关推荐
卡尔特斯21 分钟前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源21 分钟前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole29 分钟前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫1 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide2 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261352 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源2 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub2 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群2 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心3 小时前
从零开始学Flink:数据源
java·大数据·后端·flink