盘子

装盘子

五迷三道 提交于 2020-03-03 05:53:03
时限:1000ms 内存限制:10000K 总时限:3000ms 描述: N人为了大快朵颐,行至云餐二楼,取了N个盘子,打了M个饺子。现欲将M个饺子装入N个盘子中,试问共有多少种不同的装法? 假设盘子足够大,并且盘子里可以什么都不放。注意像2 5 0和5 0 2之类的属于同一种放法。 输入: 两个整数M、N(1=< M,N <=100)以空格隔开。 输出: 单独一行输出共有几种装法。 输入样例: 7 3 输出样例: 8 #include <iostream> #include <fstream> using namespace std; int FindAll(int n, int m) { int *arrange = new int[(n + 1) * (m + 1)]; int temp; ofstream out("file.txt"); memset(arrange, 0x00, sizeof(int) * (m + 1) * (n + 1)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (i > j) arrange[i * (m + 1) + j] = arrange[i * (m + 1) + j - 1] + arrange[(i - j) * (m + 1) + j];

递归算法1

最后都变了- 提交于 2020-02-25 01:15:59
今天学了递归算法,下面的题目是对递归的理解 &1.问第n个学生多大 题目描述 例2.1有n个学生坐在一起 问第n个学生多少岁?他说比第n-1个学生大2岁. 问第n-1个学生岁数,他说比第n-2个学生大2岁. .......................................................... 问第2个学生,说比第1个学生大2岁. 最后问第1个学生,他说是10岁. 请问第n个学生多大? 输入 输入n 输出 输出第n个学生的年龄 样例输入 5 样例输出 18 思路:(关键点为第一个学生的年龄) 第1个学生年龄为10岁(往后每个学生比前一个学生大两岁) n age 1 10 (当n=1时age=10,这个条件要单独列出) 2 age(2-1)+2 3 age(3-1)+2 ... ... n age(n-1)+2 #include<iostream> using namespace std; int fac(int a) { int age; if(a==1){return age=10;} else return fac(a-1)+2; } int main() { int n; cin>>n; cout<<fac(n)<<endl; return 0; } &2.Fibonacci 题目描述 Ø例5.2 求Fibonacci数列问题。

KO递归之汉诺塔---C语言

馋奶兔 提交于 2020-02-19 04:13:31
汉诺塔: 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 单看这个问题描述有点让人抓瞎,这是当然,无论多么简单的问题描述,在没有建立具体地模型之前都是让人不知所云的,仅仅用生活中的语言去描述一些数学或算法问题往往会让听者产生理解偏差, 这也和每个的理解能力和思维方式有很大关系,这就显示出数学的强大了,数学让问题不再模糊,参数和公式组成的模型让问题不再有理解偏差和误区,只可惜数学没学好,看来以后还得回来把高数、概率论这些给补回来。 说了一些题外话,下面来对汉诺塔问题进行解释和建立模型 这是示意图,a是起始柱,c是目标柱,b起到中转作用 在进行转移操作时,都必须确保大盘在小盘下面,且每次只能移动一个圆盘,最终c柱上有所有的盘子且也是从上到下按从小到大的顺序。 很多时候看到这些蛋疼和矫情操作就觉得数学家真是思维清奇、智慧如海,嗯还有吃饱了撑的,某兄台邪魅地一笑,道:直接把c和a交换位置不就行了,我想这位兄台以后或成大器或被人打死。 问题看起来并不复杂,当a柱子上只有一个盘子时只要把那个盘子直接移到c就行了, 有两个盘子的话把1号盘先移到b柱,在把2号盘移到c柱

Java-方法的使用-递归求解汉诺塔问题

北战南征 提交于 2020-02-08 17:09:47
递归求解汉诺塔问题 ​ 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 问应该如何操作? 对问题的分析: 将n个盘子从A座上移到C座上可分解为以下三个步骤: (1)将A上的n-1个盘子借助C先移到B上; 递归方法分解为: · 将A上1个盘子从A移到C; · 将A上1个盘子从A移到B; · 将C上1个盘子从C移到B; (2)将A座上剩下的一个盘移到C座上; (3)将n-1个盘从B座借助于A座移到C座上; 递归方法分解为: · 将B上1个盘子从B移到A; · 将B上1个盘子从B移到C; · 将A上1个盘子从A移到C; 其中步骤(1)和步骤(3)都是将n-1个盘从一个座移到另一个座上,采取的办法一样,只是座的名字不同。为了使之一般化,可以将步骤(1)和步骤(2)表示为: 将“one”座上的n-1个盘移到“two”座(借助“three”座) 在步骤(1)中: one对应A,two对应B,three对应C 在步骤(3)中: one对应B,two对应C,three对应A 所以

算法实验-双色汉诺塔

妖精的绣舞 提交于 2020-02-03 07:04:31
实验原理 与纯汉诺塔问题相同 实验步骤 经过奇偶异同分析可知。当出发柱子A为奇数个盘子 时;最上与最下层颜色为红色,过渡柱子C有偶数个盘子,且最 底层为蓝色:最上层位红色,目标B柱子最底层为红色.A柱子 最上层颜色为奇数一(奇数+偶数)=偶数一蓝色,过渡柱子C上 的偶数个盘子.移动时就变成出发柱子,A柱变成过渡柱子且 叠加的第一个盘子为红色,目标柱子叠加的是蓝色。以此类 推。不会出现同色叠加。 同理,当出发柱子A为偶数个盘子时,最上层为红色、最底 。层为蓝色,过度柱子C有奇数个盘子,且最上、最底层为红色,目 标B柱子最底层为蓝色。A柱子最上层颜色为偶数一(奇数+奇数) =偶数一蓝色.过渡柱子C上的奇数个盘子,移动时就变成出发 柱子.A柱变成过度柱子且叠加的第一个盘子为蓝色.目标柱子 叠加的是红色。以此类推.同样不会出现同色叠加的情况。 关键代码 void move ( int a , int b ) { out << "塔" << a << "到塔" << b << endl ; } void hanoi ( int n , int a , int b , int c ) { if ( n > 0 ) { hanoi ( n - 1 , a , c , b ) ; out << "将第" << n << "盘从" ; move ( a , b ) ; hanoi ( n - 1 ,

汉诺塔问题

一世执手 提交于 2020-01-06 13:41:08
汉诺塔hanoi问题 问题描述 假设有三个柱子A.B.C,N个盘子 每次只允许移动一个盘子 必须保证小盘子在大盘子之上 如何把所有盘子从A移到C? 理解过程(转化为递归问题) 用C柱做过渡,将A柱上的n-1的盘子移到B上 从A柱上最下面的盘子直接移到C柱上 用A柱做过渡,将B柱上的n-1个盘子移到C上 算法实现 #include "iostream" ​ using namespace std; ​ void move(int x,char a,char b) { cout<<x<<"从"<<a<<"移到"<<b<<"\n"; } ​ void hanoi(int n,char x,char y,char z) { if(n==1) move(n,x,z); else { hanoi(n-1,x,z,y); move(n,x,z); hanoi(n-1,y,x,z); } } ​ int main(void) { int n; cin>>n; hanoi(n,'A','B','C'); ​ return 0; } 来源: https://www.cnblogs.com/Mr-Peng/p/12155329.html

96. 奇怪的汉诺塔

房东的猫 提交于 2019-12-03 05:03:00
d[i]表示在三根木棍的情况下,i个盘子要走d[i]步(注意,d[i] 当前i个盘子,三根木棍均可走) f[i]表示在四根木棍的情况下,i个盘子要走的最短步数f[i]步(注意,f[i] 当前i个盘子,四根木棍均可走) f[j] * 2 或 d[i - 1] * 2 表示拿下j(或i - 1)个盘子放到一个临时棍子上,最后还得放到最终的那个棍子上,所以要乘以2 #include <iostream> #include <cstring> using namespace std; int main() { int d[15], f[15]; d[1] = 1; for(int i = 2; i <= 12; ++ i) { d[i] = 1 + d[i - 1] * 2; } memset(f, 0x3f, sizeof(f)); f[1] = 1; for(int i = 2; i <= 12; ++ i) { for(int j = 1; j < i; ++ j) { f[i] = min(f[i], f[j] * 2 + d[i - j]); } } for(int i = 1; i <= 12; ++ i) { cout << f[i] << endl; } return 0; }    来源: https://www.cnblogs.com/mjn1/p/11779114

递归和循环----汉诺塔

偶尔善良 提交于 2019-12-03 03:19:37
题目: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作? 有两个限制条件,第一个是每次只能够移动一个圆盘,第二个是大圆盘只能在小圆盘下面 思路: 如果1个盘子,你直接可以从第一根柱子移动到最后一根柱子就可以了 如果有两个盘子,第一你需要先把上面的盘子,从start柱子移动到middle柱子去,第二需要把下面的盘子,移动到最后那个盘子中最后那个柱子上,最后把上面的盘子从middle柱子上移动到end柱子上。 假设n个盘子,即函数f(n),第一步把上面的n-1盘子通过end那个空柱子最终移动到middle柱子,第二步把下面的大盘子移动到end柱子上去,第三步把上面的n-1个盘子通过start这个空柱子按照限制条件移动到end柱子上去 /** * 汉诺塔 * * @param n 盘子的数量 * @param start 开始柱子 * @param middle 中介柱子 也就是那个空闲柱子 * @param end 放结果柱子 也就是你通过移动,将这个盘子移动到哪个柱子上 *

算法系列之“汉若塔”

人盡茶涼 提交于 2019-12-03 03:17:18
一.汉若塔 1、说明: 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡 志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。 2、解法 如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。如果盘 数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1,所以当盘数为64时,则所需次数为:2^64 - 1 = 18446744073709551615为5.05390248594782e+16年,也就是约5000世纪,如果对这数字没什幺概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。 void hanoi( int n, char A,

汉诺塔

匿名 (未验证) 提交于 2019-12-02 23:55:01
''' 问题: 有三个柱子A、B、C。移动n个盘子从 A -> C 分析: 步骤1: 移动前n-1个盘子 A -> B 步骤2: 移动第n个盘子 A -> C 步骤3: 移动前n-1个盘子 B -> C 实验: (n个盘子从上到下编号:1, 2, 3,...,n) n=2: move 1 A -> B 步骤1:移动前n-1个盘子 A -> B move 2 A -> C 步骤2:移动第n个盘子到 A -> C move 1 B -> C 步骤3:移动前n-1个盘子 B -> C n=3: move 1 A -> C move 2 A -> B move 1 C -> B 移动前n-1个盘子 A -> B move 3 A -> C 移动第n个盘子到 A -> C move 1 B -> A move 2 B -> C move 1 A -> C 移动前n-1个盘子 B -> C n=4: 4 A C 3 A B 4 C B 2 A C 4 B A 3 B C 4 A C 可以看到, 要把盘子A->B 要通过C, 把盘子从B->C要通过A def move(n, start,end, middle) move n start -> middle move n-1 start -> end move n middle-> end if n==1: move 1 A -> C move