【机试备考】Day9-矩阵幂、二叉排序树

题目1:矩阵幂

牛客网-2012BUPT计算机B
给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。

输入描述

第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。
接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。

输出描述

对于每组测试数据,输出其结果。格式为:
n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。

示例

输入

2 2
9 8
9 3
3 3
4 8 4
9 3 0
3 5 7
5 2
4 0 3 0 1
0 0 5 8 5
8 9 8 5 3
9 6 1 7 8
7 2 5 7 3

输出

153 96
108 81
1216 1248 708
1089 927 504
1161 1151 739
47 29 41 22 16
147 103 73 116 94
162 108 153 168 126
163 67 112 158 122
152 93 93 111 97

题解

主要就是矩阵乘法,然后就是一个迭代乘法得k次幂

#include<iostream>
using namespace std;
//矩阵乘法c[i][j]+=a[i][k]*b[k][j]
void mul(int c[11][11],int b[11][11],int a[11][11],int n)
{
    
    
    for(int i=0;i<n;i++)
    {
    
    
        for(int j=0;j<n;j++)
        {
    
    
            int sum=0;
            for(int k=0;k<n;k++)
                sum+=a[i][k]*b[k][j];//矩阵乘法关键
            c[i][j]=sum;
        }
    }
}
//输出一个矩阵
void Print(int a[11][11],int n)
{
    
    
    for(int i=0;i<n;i++)
    {
    
    
        for(int j=0;j<n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
}
//把b数组复制到a数组
void Copy(int a[11][11],int b[11][11],int n)
{
    
    
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            a[i][j]=b[i][j];
}
int main()
{
    
    
    int m,n,k,P[11][11],res[11][11],temp[11][11];
    while(cin>>n>>k)//矩阵大小n,幂次k
    {
    
    
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
    
    
                cin>>P[i][j];
                res[i][j]=P[i][j];//结果数组
            }
        while(--k)
        {
    
    
            Copy(temp,res,n);//temp存放上一次res数据
            mul(res,temp,P,n);
        }
        Print(res,n);
    }
}

题目2:二叉排序树

牛客网-2012BUPT计算机C
输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。

输入描述

输入第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。

输出描述

可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
每种遍历结果输出一行。每行最后一个数据之后有一个空格。
 
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

示例

输入

5
1 6 5 9 8

输出

1 6 5 9 8
1 5 6 8 9
5 8 9 6 1

题解

分两步:

  1. 建二叉排序树
  2. 树的遍历(前中后)

对应的王道上都有代码,就不具体说了

#include<iostream>
using namespace std;
typedef struct node
{
    
    
    int val;
    struct node *left;
    struct node *right;
}node,*tree;
//建树
void BuildTree(tree &T,int k)
{
    
    
    //树为空,则建立新节点
    if(!T)
    {
    
    
        node *p=new node;
        p->val=k;
        p->left=NULL;
        p->right=NULL;
        T=p;
    }
    else
    {
    
    
        if(T->val==k)
            return;
        else if(k<T->val)
            BuildTree(T->left,k);
        else
            BuildTree(T->right,k);
    }
}
//递归前序遍历
void PreOrder(tree T)
{
    
    
    if(T)
    {
    
    
        cout<<T->val<<" ";
        PreOrder(T->left);
        PreOrder(T->right);
    }
}
//递归中序遍历
void MidOrder(tree T)
{
    
    
    if(T)
    {
    
    
        MidOrder(T->left);
        cout<<T->val<<" ";
        MidOrder(T->right);
    }
}
//递归后序遍历
void PostOrder(tree T)
{
    
    
    if(T)
    {
    
    
        PostOrder(T->left);
        PostOrder(T->right);
        cout<<T->val<<" ";
    }
}
int main()
{
    
    
    int n,tmp;
    while(cin>>n)
    {
    
    
        //建树
        tree T=NULL;
        for(int i=0;i<n;i++)
        {
    
    
            cin>>tmp;
            BuildTree(T,tmp);
        }
        PreOrder(T);
        cout<<endl;
        MidOrder(T);
        cout<<endl;
        PostOrder(T);
        cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43417265/article/details/113108843