期末考试算法复习2
题目如下:
1、台阶问题
2、未名湖租鞋问题
3、购票问题
4、Sine之舞
5、s01串
6、猴子分苹果
7、汉诺塔问题
8、跳马问题
1、台阶问题
有n阶台阶,上楼时可以一步一个台阶也可以一步两个台阶,编程计算共有多少种不同的走法。
1 public class 台阶问题 { 2 3 public static int f(int n) { 4 if(n==1 || n==2) { 5 return n; 6 } else { 7 return f(n-1) + f(n-2); 8 } 9 } 10 11 public static void main(String[] args) { 12 13 System.out.println(f(1)); 14 System.out.println(f(2)); 15 System.out.println(f(3)); 16 System.out.println(f(4)); 17 18 } 19 20 }
2、未名湖租鞋问题
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
1 public class 未名湖租鞋问题 { 2 3 public static int f(int m, int n) { 4 // m: 还鞋 n: 租鞋 5 if (m < n || m == 0) { 6 return 0; 7 } else if (n == 0) { 8 return 1; 9 } else { 10 return f(m-1, n) + f(m, n-1); 11 } 12 } 13 14 public static void main(String[] args) { 15 16 System.out.println(f(3, 2)); 17 18 } 19 20 }
3、购票问题
有2n个人排队购一件价为0.5元的商品,每人限购一件,其中一半人拿一张1元人民币,另一半人拿一张0.5元的人民币,要使售货员在售货中,不发生找钱困难,
问这2n个人应该如何排队?找出所有排队的方案。(假设售货员一开始就没有准备零钱)
输入格式
整数n
输出格式
手持0.5和1元的依次次序
样例输入
2
样例输出
0.5 0.5 1 1
0.5 1 0.5 1
4、Sine之舞
问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个数:N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1
#include <stdio.h> void printA(int n, int k) { if (n == k) printf("sin(%d)", n); else { printf("sin(%d", n); printf(n % 2 == 0 ? "+" : "-"); printA(n + 1, k); printf(")"); } } void printS(int n, int k) { if (n == 1) { printA(1, n); printf("+%d", k - n); } else { printf("("); printS(n - 1, k); printf(")"); printA(1, n); printf("+%d", k - n); } } int main() { int N; scanf("%d", &N); printS(N, N + 1); printf("\n"); return 0; }
5、s01串
问题描述
s01串初始为"0"
按以下方式变换
0变1,1变01
输入格式
1个整数(0~19)
输出格式
n次变换后s01串
样例输入
3
样例输出
101
数据规模和约定
0~19
1 public class s01串 { 2 public static int n; 3 public static String s = "0"; 4 5 public static void f() { 6 String temp = ""; 7 char[] chs = s.toCharArray(); 8 for(int i=0; i<chs.length; i++) { 9 if(chs[i]=='0') { 10 temp+="1"; 11 } 12 if(chs[i]=='1') { 13 temp+="01"; 14 } 15 } 16 17 s = temp; 18 } 19 20 public static void main(String[] args) { 21 22 System.out.println("Input: "); 23 Scanner input = new Scanner(System.in); 24 n = input.nextInt(); 25 26 for(int i=0; i<n; i++) { 27 f(); 28 } 29 System.out.println(s); 30 31 } 32 33 }
6、猴子分苹果
秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分。这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果。
第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起。
这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果。第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个。问,原来这些猴子至少采了多少个苹果。
输入格式
两个整数,n m
输出格式
一个整数,表示原来苹果的数目
样例输入
5 1
样例输出
15621
1 import java.util.Scanner; 2 3 public class 猴子分苹果 { 4 5 public static void main(String[] args) { 6 System.out.println(); 7 Scanner input = new Scanner(System.in); 8 int n = input.nextInt(); 9 int m = input.nextInt(); 10 System.out.println(Math.pow(n, n + 1) - (n - 1)*m); 11 } 12 13 }
7、汉诺塔问题
1 #include <stdio.h> 2 3 void hanoi (int n,char a,char b,char c) 4 { 5 if(n>0) /*0阶的汉诺塔问题当作停止条件*/ 6 { 7 hanoi(n-1,a,c,b); 8 printf("移动%d从%c盘 TO %c盘\n",n,a,b); 9 hanoi(n-1,c,b,a); 10 } 11 } 12 13 int main() 14 { 15 int n; 16 printf("请输入圆盘的数目n(小于8):\n"); 17 scanf("%d",&n); 18 hanoi(n,'A','B','C'); 19 return 0; 20 }
8、跳马问题
在n×m棋盘上有一中国象棋中的马:
- 马走日字;
- 马只能往右走。
请你找出一条可行路径,使得马可以从棋盘的左下角(1,1)走到右上角(n,m)。
输入:9 5
输出:(1,1)->(3,2)->(5,1)->(6,3)->(7,1)->(8,3)->(9,5)
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 5 6 int i=0; 7 int x,y,n; 8 int *px=new int[64]; 9 int *py=new int[64]; 10 11 12 void print(int i){ 13 int j; 14 for(j=0;j<i;j++) 15 { 16 cout<<"("<<px[j]<<","<<py[j]<<")->"; 17 } 18 19 } 20 21 int find(int x,int y,int n) { 22 if(x>n||y>n||x<1||y<1) { 23 return 0; 24 } else 25 return 1; 26 } 27 28 void place(int x ,int y ,int n,int i) 29 { 30 int f=1; 31 if(x==n&&y==n) 32 { 33 print(i); 34 cout<<"("<<x<<","<<y<<")"<<endl; 35 f=0; 36 } 37 px[i]=x; 38 py[i]=y; 39 40 if(find(x,y,n)==1&& f!=0) 41 { 42 place(x+2 ,y+1,n,i+1); 43 place(x+2 ,y-1,n,i+1); 44 place(x+1 ,y+2,n,i+1); 45 place(x+1 ,y-2,n,i+1 ); 46 } 47 } 48 49 int main() 50 { 51 52 place(1,1,8,0); 53 54 return 0; 55 } 56