算法设计(一)

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


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

相关推荐
橙子19911016几秒前
Kotlin 中的作用域函数
android·开发语言·kotlin
zimoyin几秒前
Kotlin 懒初始化值
android·开发语言·kotlin
Persistence___8 分钟前
SpringBoot中的拦截器
java·spring boot·后端
迷茫不知归路15 分钟前
操作系统实验习题解析 上篇
c++·算法·操作系统·实验课设
嘵奇21 分钟前
Spring Boot 跨域问题全解:原理、解决方案与最佳实践
java·spring boot·后端
黄雪超26 分钟前
JVM——方法内联之去虚化
java·开发语言·jvm
愚润求学36 分钟前
【递归、搜索与回溯】专题一:递归(二)
c++·笔记·算法·leetcode
h汉堡36 分钟前
C/C++内存管理
java·c语言·开发语言·c++·学习
旋风小飞棍1 小时前
如何在sheel中运行spark
大数据·开发语言·scala
枣伊吕波1 小时前
第六节第二部分:抽象类的应用-模板方法设计模式
android·java·设计模式