算法设计(一)

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);			
	}
}


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

相关推荐
我不是小upper13 分钟前
L1和L2核心区别 !!--part 2
人工智能·深度学习·算法·机器学习
闲敲棋子落灯华14 分钟前
java学习笔记(三)--java包的引入、访问控制、类的继承、super关键字、重载、重写、运算符、拆箱
java·后端
程序员岳焱16 分钟前
Java 使用 Spring AI 的 10 个实用技巧
java·后端·程序员
Bug改不动了20 分钟前
迁移达梦数据库过程中,如何快速识别需要改写的Mapper SQL方法
java·mybatis
crud28 分钟前
Spring Boot 使用 @Async 实现异步操作:从入门到实战,一文讲透
java·spring boot
代码小将38 分钟前
java中static学习笔记
java·笔记·学习
std787941 分钟前
VITA STANDARDS LIST,VITA 最新标准清单大全下载_ansi vita 2025
java·前端·javascript
虾球xz1 小时前
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
开发语言·c++·物联网·学习
迢迢星万里灬1 小时前
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
java·spring boot·spring·mybatis·计算机基础·面试指南
烟沙九洲1 小时前
@Transactional 什么情况下会失效
java·spring