俗话说:“活到老,学到老。”今天小编就分享一下vector容器入门+递归汉诺塔问题的知识点和例题。
vector容器入门
知识点
vector<int> v; | 定义vector容器 |
vector<int> v; int n,k,x,y; cin>>n; cin>>k; v.push_back(k); } cin>>x>>y; v.insert(v.begin()+x-1,y); for(int i=0;i<=n;i++){ cout<<v[i]<<' '; } | 在x位置插入y |
vector<int> v; int n,k,x; cin>>n; for(int i=0;i<n;i++){ cin>>k; v.push_back(k); } cin>>x; v.erase(v.begin()+x-1); for(int i=0;i<n-1;i++){ cout<<v[i]<<' '; } | 删除x位置的值 |
vector<int> v; int n,k,x,y; cin>>n; for(int i=0;i<n;i++){ cin>>k; v.push_back(k); } cin>>x; y=x; v.erase(v.begin()); v.push_back(y); for(int i=0;i<n;i++){ cout<<v[i]<<' '; } | 数组元素的移动,把数组的第x个位置的元素先保存起来,然后把x+1到n的元素,依次往前移一位,最后原来的第x个位置的元素放在最后 |
例题
1.【入门】数组元素的插入
描述
在一个数组的第x个位置插入一个新的数y
输入描述
有四行 第一行有一个整数n ( 5 <= n <= 10 ) 第二行有n个整数 第三行有一个整数x,为要插入的位置 第四行有一个整数y,为要插入的整数
输出描述
更新后的数组
用例输入 1
5 7 2 3 4 5 2 9
用例输出 1
7 9 2 3 4 5
来源
数组问题
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v;
int n,k,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>k;
v.push_back(k);
}
cin>>x>>y;
v.insert(v.begin()+x-1,y);
for(int i=0;i<=n;i++){
cout<<v[i]<<' ';
}
return 0;
}
2.【入门】数组元素的删除
描述
把一个数组的第x个位置的元素删除掉
输入描述
有三行
第一行有一个整数n( n <= 10 )
第二行有n个整数
第三行有一个整数x,为要删除的位置
输出描述
输出更新后的数组
用例输入 1
5 1 2 3 4 5 3
用例输出 1
1 2 4 5
来源
数组问题
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v;
int n,k,x;
cin>>n;
for(int i=0;i<n;i++){
cin>>k;
v.push_back(k);
}
cin>>x;
v.erase(v.begin()+x-1);
for(int i=0;i<n-1;i++){
cout<<v[i]<<' ';
}
return 0;
}
3.【入门】数组元素的移动
描述
数组元素的移动,把数组的第x个位置的元素先保存起来,然后把x+1到n的元素,依次往前移一位,最后原来的第x个位置的元素放在最后
输入描述
有3行
第一行有一个整数n( n <= 10 )
第二行有n个整数
第三行有一个整数x
输出描述
移动后的数组
用例输入 1
8 1 2 3 4 5 6 7 8 1
用例输出 1
2 3 4 5 6 7 8 1
来源
数组问题
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v;
int n,k,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>k;
v.push_back(k);
}
cin>>x;
y=x;
v.erase(v.begin());
v.push_back(y);
for(int i=0;i<n;i++){
cout<<v[i]<<' ';
}
return 0;
}
递归汉诺塔问题
扩展
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。
例题
1.【基础】递归问题—汉诺塔
描述
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。
算法思路:
1.如果只有一个金片,则把该金片从源移动到目标棒,结束。
2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒。
输入描述
一个整数N,表示A柱上有N个碟子。(0<n<=10)
输出描述
若干行,即移动的最少步骤
用例输入 1
3
用例输出 1
A To C A To B C To B A To C B To A B To C A To C
来源
递归
代码
#include <bits/stdc++.h>
using namespace std;
void fun(int n,char s,char m,char e){
if(n==1){
cout<<s<<" To "<<e<<endl;
return;
}
fun(n-1,s,e,m);
cout<<s<<" To "<<e<<endl;
fun(n-1,m,s,e);
}
int main(void) {
int n;
char a='A',b='B',c='C';
cin>>n;
fun(n,a,b,c);
return 0;
}
2.【入门】汉诺塔的移动次数
描述
汉诺塔的问题大家都已经很熟悉了,有三个柱子,每个柱子上有一些大小不一的金片,要把金片从A柱移动到C柱,可以借助B柱,请问n个金片的情况下,需要最少移动多少次?
输入描述
输入一个整数n代表金片的数量(n<=20)
输出描述
一个整数,代表n个金片的移动次数
用例输入 1
3
用例输出 1
7
来源
递归
代码
#include <bits/stdc++.h>
using namespace std;
int f(int n){
if(n!=1){
return f(n-1)*2+1;
}
else return 1;
}
int main() {
int n;
cin>>n;
cout<<f(n);
return 0;
}
好了,今天的分享就到这里,我们下期再见!