数据结构作业2

A统计回文子串

#include <iostream>  
#include <vector>  
using namespace std;  
   
int countPalindromicSubstrings(string s) {  
    int n = s.length();  
   
    vector<vector<bool>> dp(n, vector<bool>(n, false));  
    int count = 0;  
   
    for (int i = 0; i < n; i++) {  
        dp[i][i] = true;  
        count++;  
    }  
   
    for (int len = 2; len <= n; len++) {  
        for (int i = 0; i <= n - len; i++) {  
            int j = i + len - 1;  
            if (s[i] == s[j]) {  
                if (len == 2 || dp[i + 1][j - 1]) {  
                    dp[i][j] = true;  
                    count++;  
                }  
            }  
        }  
    }  
   
    return count;  
}  
   
int main() {  
    string s;  
    while (cin >> s) {  
        int count = countPalindromicSubstrings(s);  
        cout << count << endl;  
    }  
    return 0;  
}

B构建矩阵

题目描述
现请你构建一个N*N的矩阵,第i行j列的元素为i与j的乘积。(i,j均从1开始)
输入
输入的第一行为一个正整数C,表示测试样例的个数。
然后是C行测试样例,每行为一个整数N(1<=N<=9),表示矩阵的行列数。
输出
对于每一组输入,输出构建的矩阵。
样例输入 复制
2
1
4
样例输出 复制
1
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16

#include <iostream>  
#include <vector>  
using namespace std;  
   
void buildMatrix(int N) {  
    vector<vector<int>> matrix(N, vector<int>(N, 0));  
    for (int i = 0; i < N; i++) {  
        for (int j = 0; j < N; j++) {  
            matrix[i][j] = (i + 1) * (j + 1);  
        }  
    }  
     
    for (int i = 0; i < N; i++) {  
        for (int j = 0; j < N; j++) {  
            cout << matrix[i][j] << " ";  
        }  
        cout << endl;  
    }  
}  
   
int main() {  
    int C;  
    cin >> C;  
    for (int i = 0; i < C; i++) {  
        int N;  
        cin >> N;  
        buildMatrix(N);  
    }  
    return 0;  
}

C找规律填数

题目描述
小宇正在读小学,今天老师布置了几道数学题目。小宇平时上课经常不专心,这些他可发愁了,怎么办呢?看看你能不能帮帮他。
题目是给你一组有规律序列的前面5个整数,请你给出它后面跟着的5个整数,如:1,2,3,4,5,,,,,__。这是个等差数列,后面应该是6,7,8,9,10,就这么简单。而且现在小宇已经知道这串序列要么是等差数列,要么是等比数列或者是斐波那契数列。
输入
输入包含多组测试数据。每组输入5个整数,每个数字之间隔一个空格,当5个数字都为0时输入结束。
输出
对于每组输入,输出这串数列的后面5个数字,每个数字之间隔一个空格。
样例输入 复制
1 2 3 4 5
1 2 4 8 16
1 2 3 5 8
0 0 0 0 0
样例输出 复制
6 7 8 9 10
32 64 128 256 512
13 21 34 55 89

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    float a[15];
    while(1){
 
    int dc=1,db=1,fb=1;
  //int a[15];
  for(int i = 0;i < 5;i++){
      cin>>a[i];
  }
  if(a[0]==0&&a[4]==a[0]&&a[3]==0&&a[2]==0&&a[1]==0){
      break;
  }
  float d;
  float q;
  for(int i = 1;i < 5;i++){
       
          if(dc==1)     
         { if(i==1){
            d=a[i]-a[i-1];      
          }
          else if(d!=a[i]-a[i-1]){
            dc=0;
          }
      }
       
      if(db==1){
          if(i==1){
              q=a[i]/a[i-1];
          }
          else if((q!=a[i]/a[i-1])){
              db=0;
          }
      }
      if(fb==1){
          if(i>=2&&i<5){
           if(a[i]!=(a[i-1]+a[i-2])){
            fb=0;
           }
          }
      }
   
  }
  int num;
  if(dc==1){
      num=a[4];
     for(int i = 0;i < 5;i++){
         num=num+d;
         cout<<num;
         if(i!=4){
             cout<<" ";
         }
     } 
     cout<<endl;
     //continue;
  }
  else if(db==1){
      num=a[4];
      for(int i = 0;i < 5;i++){
        num=num*q;
          cout<<num;
          if(i!=4){
              cout<<" ";
          }
      }
      cout<<endl;
      //continue;
  }
  else if(fb==1){
      
     // cout<<a[5]<<" ";
      for(int i = 5;i < 10;i++){
           
          a[i]=a[i-1]+a[i-2];
          cout<<a[i];
          if(i!=9)
          cout<<" ";
      }
      cout<<endl;
     // continue;
  }
     
}
return 0;
}

D复原二叉树

题目描述
小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。
输入
输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。
输出
对于每组输入,输出对应的二叉树的后续遍历结果。
样例输入 复制
DBACEGF ABCDEFG
BCAD CBAD
样例输出 复制
ACBFGED
CDAB

#include <iostream>  
#include <string>  
#include <vector>  
using namespace std;  
   
struct BTNode {  
    char data;  
    BTNode *lchild;  
    BTNode *rchild;  
    BTNode(char x) {  
        data = x;  
        lchild = rchild = NULL;  
    }  
};  
   
// 根据先序和中序还原树  
BTNode* buildTree(string pre, int i, string mid, int j, int n) {  
    if (n <= 0) return NULL;  
    char root_data = pre[i];  
    BTNode *root = new BTNode(root_data);  
    int p = j;  
    while (mid[p] != root_data) p++;  
    int num = p - j;  
    root->lchild = buildTree(pre, i+1, mid, j, num);  
    root->rchild = buildTree(pre, i+num+1, mid, p+1, n-num-1);  
    return root;  
}  
   
void display(BTNode *root) {  
    if (root == NULL) return;  
    display(root->lchild);  
    display(root->rchild);  
    cout << root->data;  
}  
   
int main() {  
    string pre, mid;  
    BTNode *root;  
    while (cin >> pre >> mid) {  
        root = buildTree(pre, 0, mid, 0, pre.size());  
        display(root);  
        cout << endl;  
    }  
    system("pause");  
    return 0;  
}

E 子树的后序遍历

题目描述
给你一颗二叉树的中序和后序遍历序列,请编程输出该二叉树左子树或右子树的后序遍历序列。
输入
占三行,第一行表示二叉树的中序遍历序列,第二行表示后序遍历序列。用大写字母标识结点,二叉树的结点最多26个。
第三行是单个字母,L表示要求输出该二叉树的左子树的后序遍历序列,R表示要求输出该二叉树的右子树的后序遍历序列。
输出
按要求输出该二叉树左子树或右子树的后序遍历序列。
样例输入 复制
BDCEAFHG
DECBHGFA
R

#include<iostream>
#include<string>
using namespace std;
struct BTNode{
    char data;
    BTNode *lchild,*rchild;
    BTNode(char x):data(x),lchild(NULL),rchild(NULL){}
};
BTNode *build(string &in,int i,string &post,int j,int n){
    if(n<=0)return NULL;
    char data = post[j+n-1];
    int p=i;
    while(in[p]!=data)p++;
    int num = p-i;
    BTNode *root = new BTNode(data);
    root->lchild = build(in,i,post,j,num);
    root->rchild = build(in,p+1,post,j+num,n-num-1);
    return root;
}
void display(BTNode *root){
    if(root==NULL)return;
    display(root->lchild);
    display(root->rchild);
    cout<<root->data;
}
int main(){
    string in,post;
    char order;
    cin>>in>>post>>order;
    BTNode *root=build(in,0,post,0,in.size());
    if(order=='L')display(root->lchild);
    else display(root->rchild);
    system("pause");
    return 0;
}

F迷宫问题

题目描述
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。
输入
输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
输出
对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。
样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出
9

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
 
using namespace std;
 
struct Point {
    int x, y, dist;
};
 
int bfs(vector<vector<char>>& maze, int startX, int startY, int endX, int endY) {
    int rows = maze.size();
    int cols = maze[0].size();
    vector<vector<bool>> visited(rows, vector<bool>(cols, false));
    queue<Point> q;
 
    // 定义上下左右四个方向的偏移量
    int dx[] = {-1, 1, 0, 0};
    int dy[] = {0, 0, -1, 1};
 
    // 将起点加入队列并标记为已访问
    q.push({startX, startY, 0});
    visited[startX][startY] = true;
 
    while (!q.empty()) {
        Point current = q.front();
        q.pop();
 
        int x = current.x;
        int y = current.y;
        int dist = current.dist;
        // 如果当前位置是终点,返回最短距离
        if (x == endX && y == endY) {
            return dist;
        }
 
        // 向四个方向进行探索
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
 
            // 如果新位置越界或者是障碍物或者已经访问过,则跳过
            if (nx < 0 || nx >= rows || ny < 0 || ny >= cols || maze[nx][ny] == '#' || visited[nx][ny]) {
                continue;
            }
 
            // 将新位置加入队列并标记为已访问
            q.push({nx, ny, dist + 1});
            visited[nx][ny] = true;
        }
    }
 
    // 如果无法到达终点,返回-1
    return -1;
}
 
int main() {
    int T;
    cin >> T;
    while (T--) {
        int N, M;
        cin >> N >> M;
 
        vector<vector<char>> maze(N, vector<char>(M));
 
        int startX, startY, endX, endY;
 
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                cin >> maze[i][j];
                if (maze[i][j] == 'S') {
                    startX = i;
                    startY = j;
                } else if (maze[i][j] == 'E') {
                    endX = i;
                    endY = j;
                }
            }
        }
 
        int shortestDist = bfs(maze, startX, startY, endX, endY);
        cout << shortestDist << endl;
    }
 
    return 0;
}
     

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值