当前位置:   article > 正文

矿大数据结构 实验二_中国矿业大学数据结构实验2

中国矿业大学数据结构实验2

 

目录

 

A: 子串个数

B.模式串

C.主对角线上的数据和

D.顺时针排螺旋阵

E: 汉诺塔游戏中的移动

F.树的先根遍历

G.树的后根遍历


A: 子串个数

本题未考虑重复的情况,直接使用公式既可

考虑重复的情况:不同子串个数 - 洛谷

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int cs(string s) {
  4. int n = s.length();
  5. return n * (n + 1) / 2+1;
  6. }
  7. string s;
  8. int main() {
  9. while (getline(cin,s)){
  10. cout<<cs(s)<<'\n';
  11. }
  12. return 0;
  13. }

B.模式串

应该是想考察KMP的,但由于样例很水,导致暴力就能拿满。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 10000;
  4. string tar,s;
  5. int main(){
  6. cin>>s>>tar;
  7. for(int i=0;i<=s.length()-tar.length();i++){
  8. for(int j=0;j<tar.length();j++){
  9. if(s[i+j]!=tar[j]) break;
  10. if(j==tar.length()-1)
  11. {
  12. cout<<i+1;
  13. return 0;
  14. }
  15. }
  16. }
  17. cout<<0;
  18. }

C.主对角线上的数据和

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long sum = 0;
  4. int main(){
  5. int n;cin>>n;
  6. int temp;
  7. cin>>temp;
  8. sum+=temp;
  9. for(int i=1;i<n;i++){
  10. for(int i=1;i<=n;i++){
  11. cin>>temp;
  12. }
  13. cin>>temp;
  14. sum+=temp;
  15. }
  16. cout<<sum;
  17. }

D.顺时针排螺旋阵

模拟题,看成回型阵一层一层模拟即可

回是口中口

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 110;
  4. int a[MAXN][MAXN];
  5. int main(){
  6. int n,i=0,j,now=0;
  7. cin>>n;
  8. int r=1,cnt=n; //r为层
  9. while(r<=cnt){ //模拟,横五竖四
  10. for( j=r ;j<=cnt;j++) a[r][j]=++now; //up
  11. for(i=r+1 ;i<=cnt;i++) a[i][cnt]=++now; //right
  12. for(j=cnt-1;j>=r ;j--) a[cnt][j]=++now; //down
  13. for(i=cnt-1;i>r ;i--) a[i][r]=++now; //left
  14. r++;cnt--;
  15. }
  16. for(i=1;i<=n;i++){
  17. for(j=1;j<=n;j++)
  18. cout<<a[i][j]<<' ';
  19. printf("\n");
  20. }
  21. }

E: 汉诺塔游戏中的移动

假设现在要把n个盘子移动到C上,那么我们需要做的就是将最大的那个盘子移动到C上,再将其余的盘子移动到C上。解决n-1个盘子的问题时亦是如此。而解决第n-1个盘子的问题时,刚刚所说的第 n 个盘子完全可以视而不见,故对结果没有影响。由此可见,不断递归下去,最终会来到1个盘子的问题,这样即可解决问题。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 110;
  4. int cnt=0;
  5. void solve(int n,char start,char mid,char tar){
  6. if(n==1){
  7. cnt++;
  8. printf("%d %d %c->%c\n",cnt,n,start,tar);
  9. return;
  10. }
  11. solve(n-1,start,tar,mid);
  12. cnt++;
  13. printf("%d %d %c->%c\n",cnt,n,start,tar);
  14. solve(n-1,mid,start,tar);
  15. }
  16. int main(){
  17. int n;cin>>n;
  18. solve(n,'A','B','C');
  19. }

F.树的先根遍历

样例具有误导性,事实上这个题并不是二叉树。既然不是二叉树,那么使用结构体就略嫌麻烦。不如使用数组,用 t [i][j] 代表 i 的孩子分别是谁  cnt[i] 代表 i 有几个孩子

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 10000;
  4. int t[MAXN][30];
  5. int cnt[MAXN];
  6. void pre_order(int x){ //前序遍历
  7. cout<<(char)(x+'A')<<' ';
  8. for(int i=1;i<=cnt[x];i++){
  9. pre_order(t[x][i]);
  10. }
  11. }
  12. string s;
  13. int main(){
  14. int root=0; //用来确定谁是根
  15. int now = 0;
  16. char s1,s2;
  17. while(cin>>s1>>s2){
  18. if(now==0){
  19. root=s1-'A';
  20. }
  21. now++; //将根初始化
  22. t[s1-'A'][++cnt[s1-'A']] = s2-'A'; //处理输入的数据
  23. if(s2-'A'==root) //更新根
  24. root = s1-'A';
  25. }
  26. pre_order(root);
  27. }

G.树的后根遍历

在上一题的基础上略加改动即可。先遍历孩子,再输出本身

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 10000;
  4. int t[MAXN][30];
  5. int cnt[MAXN];
  6. void aft_order(int x){
  7. for(int i=1;i<=cnt[x];i++){
  8. aft_order(t[x][i]);
  9. }
  10. cout<<(char)(x+'A')<<' ';
  11. }
  12. string s;
  13. int main(){
  14. int root=0;
  15. int now = 0;
  16. char s1,s2;
  17. while(cin>>s1>>s2){
  18. if(now==0){
  19. root=s1-'A';
  20. }
  21. now++;
  22. t[s1-'A'][++cnt[s1-'A']] = s2-'A';
  23. if(s2-'A'==root)
  24. root = s1-'A';
  25. }
  26. aft_order(root);
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/897279
推荐阅读
相关标签
  

闽ICP备14008679号