vector容器入门+递归汉诺塔问题

俗话说:“活到老,学到老。”今天小编就分享一下vector容器入门+递归汉诺塔问题的知识点和例题。

vector容器入门

知识点

vector<int> v;定义vector容器

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]<<' ';

}

在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.【入门】汉诺塔的移动次数

描述

image.png


汉诺塔的问题大家都已经很熟悉了,有三个柱子,每个柱子上有一些大小不一的金片,要把金片从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;
}

好了,今天的分享就到这里,我们下期再见!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值