算法设计(一)

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


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

相关推荐
gb42152873 分钟前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶3 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_433618445 分钟前
shell 编程(二)
开发语言·bash·shell
闻缺陷则喜何志丹8 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
zfoo-framework11 分钟前
【jenkins插件】
java
风_流沙16 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
charlie11451419120 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满20 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99926 分钟前
PHP中替换某个包或某个类
开发语言·php