《算法与设计》练习三

《算法与设计》练习三

1.题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
在这里插入图片描述

输入
多组数据输入,每组数据包含两个正整数a, b,且 a<b。

输出
蜜蜂从蜂房a爬到蜂房b的可能路线数。

在这里插入图片描述

解题
方法一:直接相减,例如从5到7,用从1到7的路线数减去从1到5的路线图
方法二:转换成从蜂房1开始,例如从5到7转换成从1到3

//方法二解题代码:
import java.util.Scanner;

public class Main {

	public static void  main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()){
			int a = scanner.nextInt();
			int b = scanner.nextInt();
			int y=0,t = 0;
			if(a>b){
				t=a;
				a=b;
				b=t;				
			}
			if(a==1){
				y = fun(b);
			}else{
				y = fun(b-(a-1));
			}
			
			System.out.println(y);
		}
	}
	
	public static int fun(int x){
		if(x==1){
			return 0;
		}else if(x==2){
			return 1;
		}else if(x==3){
			return 2;
		}else{
			return fun(x-1)+fun(x-2);
		}
		
	}

}

2.题目描述
编写一个程序,使用递归算法输出一个一维字符数组中所有字符的全排列,假设字符都不一样。例如{‘a’,‘b’,‘c’}的全排列为(a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)

在这里插入图片描述

import java.util.Scanner;

public class MainB {

	public static void main(String[] args) {
		
		
		char[] x ={'a','b','c','d','e','f','g','h','i','j','k','l','m',
				'n','o','p','q','r','s','t','u','v','w','x','y','z'};
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()){
			int n = scanner.nextInt();
			if(n>=1&&n<=26){
				fun(x,0,n);
				
			}
			
			System.out.println();//每组输出有空行
			
		}
		
	}

	private static void fun(char[] x, int k, int n) {
		char t;
		
		if(k==n){
			for(int i1=0;i1<n;i1++){
				System.out.printf("%c",x[i1]);
				
			}
			System.out.println();
			
		}else{
			for(int i=k;i<n;i++){
				t=x[i];
				x[i]=x[k];
				x[k]=t;//轮流做第k个
				
				fun(x,k+1,n);//递归表达式
				
				t=x[i];//位置复原
				x[i]=x[k];
				x[k]=t;
				
			}
		}
		
	}

}

3.题目描述
使用递归编写一个程序,逆序输出一个正整数。例如输入1234,输出4321。

在这里插入图片描述

import java.util.Scanner;

public class MainC {



	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()){
			int n = scanner.nextInt();
			if(n==0){
				System.out.println(n);
			}else{
			
				while(true){
					if(n%10==0){
						n=n/10;
					}else{
						dao(n);
						break;
					}
				}
			}			
		}
	}
	
	public static void dao(int n){
			System.out.printf("%d",n%10);
			n=n/10;
			if(n>0){
				dao(n);
				}else{
					System.out.println();
					}
			}

}



4.题目描述
用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
在这里插入图片描述

在这里插入图片描述

import java.util.Scanner;

public class MainD {

	

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()){
			int n = scanner.nextInt();
			System.out.println(fun(n));
		}

	}

	private static int fun(int n) {
		if(n==1){
			return 1;
		}else if(n==2){
			return 2;
		}else{
			return fun(n-1)+fun(n-2);
		}
	
		
	}

}

5.题目描述
使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下:
第1步:1号盘从A柱移至B柱
第2步:2号盘从A柱移至C柱

在这里插入图片描述

import java.util.Scanner;

public class MainE {

	static int step ;
	

	public static void main(String[] args) {
	
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()){
			step=1;
			int n = scanner.nextInt();
			
			hanoi(n,"A","B","C");
			
			System.out.println();//每组输出有一行空行
		}
		

	}

	private static void hanoi(int n, String A, String B, String C) {
		if(n>0){
			hanoi(n-1,A,C,B);//借助C柱把n-1个盘子从A柱移到B柱
		    move(n,A,C);     //把最后一个盘子从A柱移到C柱
			hanoi(n-1,B,A,C);//把n-1个盘子借助A柱从B柱移到C柱
		}
		
	}

	private static void move(int n, String A, String B) {
		
		
		System.out.println("第"+step+++"步:"+n+"号盘从"+A+"柱移至"+B+"柱");
	
		
		
	}
	

}

6.题目描述
一只超级青蛙一次可以跳上1级台阶,也可以跳上2级……它也能够跳上n级台阶。请问,该青蛙跳上一个n级的台阶总共有多少种跳法?

在这里插入图片描述
通过公式推导可以发现n阶青蛙跳满足以下公式
在这里插入图片描述


import java.util.Scanner;

public class MainF {

	public static void  main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			int x = scanner.nextInt();
			int y = (int) Math.pow(2, x-1);
			System.out.println(y);
		}
		
	}

}

7.题目描述
“汉诺塔”是一个众所周知的古老游戏。
现在我们把问题稍微改变一下:如果一共有4根柱子,而不是3根,那么至少需要移动盘子多少次,才能把所有的盘子从第1根柱子移动到第4根柱子上呢?
为了编程方便,您只需要输出这个结果mod 10000的值。

在这里插入图片描述

import java.util.Scanner;

public class MainG {

	

	public static void main(String[] args) {
		int x[] = new int[50001];
		x[0]=0;
		int a=1,b=a,k=1;
		
		for(int i=1;i<x.length;i++){
			x[i]=(x[i-1]+k)%10000;
			b--;
			if(b==0){
				a++;
				b=a;
				k*=2;
				k=k%10000;
			}
		}
		
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			int n = scanner.nextInt();
			if(n>0&&n<=50000){
				System.out.println(x[n]);
			}
		}

	}

}

参考博客https://blog.csdn.net/wsqgwp/article/details/9164399

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值