69.杨辉三角

问题描述

还记得中学时候学过的杨辉三角吗?

基本的特征是:

前提:端点的数为1.

  1. 每个数等于它上方两数之和。

  2. 每行数字左右对称,由1开始逐渐变大。

  3. 第n行的数字有n项。

你可以参考以下的图形:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int t;
    cin>>t;
    for(int i=0;i<t;i++){
        int n;
        cin>>n;
        vector<vector<int>> a(n,vector<int>(n,0));
        for(int j=0;j<n;j++)
            a[j][0]=1;
        for(int j=0;j<n;j++){
            cout<<a[j][0];
            if(j!=0)
                cout<<" ";
            for(int k=1;k<=j;k++){
                a[j][k]=a[j-1][k-1]+a[j-1][k];
                cout<<a[j][k];
                if(k!=j)
                    cout<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    }
}

70.矩阵问题

问题描述

从键盘上输入一个整数N,按以下规律输出一个(2N+1)*(2N+1)的矩阵:

对角线的值为1,

上半三角区域值为2,

下半三角区域值为3,

左半三角区域的值为4,

右半三角区域的值为5。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    while(cin>>n){
        for(int i=0;i<2*n+1;i++){
            for(int j=0;j<2*n+1;j++){
                if(j!=0)
                    cout<<" ";
                if(i==j || i==2*n-j)
                    cout<<1;
                if(i<j && i<2*n-j)
                    cout<<2;
                if(i<j && i>2*n-j)
                    cout<<5;
                if(i>j && i<2*n-j)
                    cout<<4;
                if(i>j && i>2*n-j)
                    cout<<3;
            }
            cout<<endl;
        }
    }
}

71.发牌

问题描述

编制一个模拟发牌的程序。有编号为1,2,3,4四个人,将一付去掉大小怪的扑克按照如下顺序排列梅花c0-c12,方块d0-d12,红桃h0--h12,黑桃s0-s12,然后按照1,2,3,4四个人的顺序发牌,问最后每个人手上的牌有哪些。

个人总结

列优先从上到下从左到右遍历创建数组

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n;
    vector<vector<int>> a(4,vector<int>(13,0));
    vector<char> h({'c','d','h','s'});
    int cnt=0;
    for(int j=0; j<13; j++)
    {
        for(int i=0; i<4; i++)
        {
            a[i][j]=cnt++;

        }
    }

    while(cin>>n)
    {
        for(int i=0;i<13;i++){
            if(i!=0)
                cout<<" ";
            cout<<h[a[n-1][i]/13]<<" "<<a[n-1][i]%13;

        }
        cout<<endl;
    }
}

72.数字金字塔

问题描述

考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30

个人总结

简单dp问题,dp[i][j]表示移动到(i,j)处时最长的路径,取该数字最后一行的最大值即为答案

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    int r;
    cin>>r;
    vector<vector<int>> a(r,vector<int>(r,0));
    for(int i=0;i<r;i++){
        for(int j=0;j<=i;j++){
            cin>>a[i][j];
        }
    }

    vector<vector<int>> dp(r,vector<int>(r,0));//dp[i][j]表示移动到(i,j)处时最长的路径
    for(int i=0;i<r;i++){
        for(int j=0;j<=i;j++){
            if(i==0)
                dp[i][j]=a[i][j];
            else if(j==0)
                dp[i][j]=dp[i-1][j]+a[i][j];

            else
                dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]);
        }
    }
    auto max_path=max_element(dp[r-1].begin(),dp[r-1].end());
    cout<<*max_path<<endl;
}

73.稀疏矩阵

问题描述

今天明明学到了什么叫做矩阵,但他发现要将一个矩阵输入进电脑是一件很麻烦的事。特别是有些矩阵很大,且大部分元素都是0,我们称这类矩阵为稀疏矩阵。 于是,明明发明了一种简单的表示方法,只指出矩阵中非零元素来表示该矩阵。

例如一个矩阵:

0 0 0 5

2 0 0 0

0 1 0 0

0 0 4 0

可以表示成:

1 4 5

2 1 2

3 2 1

4 3 4

但明明又开始力不从心了,于是再一次想到了你...

明明的问题可以归结为:试编程将一个稀疏矩阵a转换成只存放非零元素的矩阵b,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列以及它的值。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    int m,n;
    while(cin>>m>>n){
        vector<vector<int>> a;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int x;
                cin>>x;
                if(x!=0){
                    a.push_back({i+1,j+1,x});
                }
            }
        }

        for(int i=0;i<a.size();i++){
            for(int j=0;j<a[i].size();j++){
                if(j!=0)
                    cout<<" ";
                cout<<a[i][j];
            }
            cout<<endl;
        }
        cout<<endl;
    }



}

74.矩阵转换

问题描述

明明是一个很聪明的孩子,学什么东西都很快。但是他也有个缺点,就是不愿意做重复的劳动,往往学会一样东西以后,就不太愿意再去碰它。有一天,明明在数学课上学了矩阵的转换,即有一个r×r的矩阵,把矩阵中的数以左上到右下的对角线的方式进行交换,然后形成一个新的矩阵。

例如:有个3×3的矩阵如下:

1 2 3

4 5 6

7 8 9

通过以左上到右下的对角线交换后,形成了一个新的矩阵:

1 4 7

2 5 8

3 6 9

明明很快就学会了,然后自己动手做了几个类似的转换。但是,课后老师布置了很多矩阵转换的作业,让同学回家练习,这就使明明很厌烦了,觉得自己已经学会了,就没有再练习的必要了。于是明明就请你帮个忙,帮他写一个程序,来计算矩阵的交换,帮他完成老师布置的作业。

明明的问题可以归结为:有一个r×r的矩阵,把矩阵中的数以左上到右下的对角线的方式进行转换,然后输出转换后的矩阵。

#include <iostream>
#include <vector>

using namespace std;

int main(){
    int n;
    while(cin>>n){
        vector<vector<int>> a(n,vector<int>(n,0));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(i==j)
                    cin>>a[i][j];
                else if(i<j)
                    cin>>a[j][i];
                else if(i>j)
                    cin>>a[j][i];
            }
        }

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(j!=0)
                    cout<<" ";
                cout<<a[i][j];
            }
            cout<<endl;
        }
        cout<<endl;

    }
}

75.魔方阵

问题描述

在一次数学课上,明明的老师讲了一种非常有趣的方阵,称之为三阶魔方阵。

它是一个三行三列,由1、2、3、……8、9,九个数字共同构成,且它每行、每列、两对角线之和均相等,于是一个合法的三阶魔方阵就形成了以下的方阵:

8 1 6

3 5 7

4 9 2

富有钻研精神的明明回家后,马上就对三阶魔方阵进行研究。

他总结出了5条n阶魔方阵的规律(n为奇数),如下:

(1) 将“1”放在第一行(最上面一行)中间一列;

(2) 从“2”开始直到n*n为止各数依次按下列规则存放:每一个数存放的行的行数比前一个数的行数减1,每一个数存放的列的列数比前一个数的列数加1,即前一个数的右上方。

(3) 如果上一数的行数为1,则下一个数的行数为n(指最下面一行);

(4) 当上一个数的列数为n时,下一个数的列数应为1(指最左一列);

(5) 如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

有了以上的方法,明明就可以轻易地构造出任意的n阶魔方阵。

例如构造3阶魔方阵的过程如下:

先将1放在第一行的中间一列:

放1:(参考规则1)

* 1 *

* * *

* * *

放2:(参考规则3)

* 1 *

* * *

* * 2

放3:(参考规则4)

* 1 *

3 * *

* * 2

放4:(参考规则5)

* 1 *

3 * *

4 * 2

放5:(参考规则2)

* 1 *

3 5 *

4 * 2

放6:(参考规则2)

* 1 6

3 5 *

4 * 2

放7:(参考规则5)

* 1 6

3 5 7

4 * 2

放8:(参考规则4)

8 1 6

3 5 7

4 * 2

放9:(参考规则3)

8 1 6

3 5 7

4 9 2

但是随着n的不断增大,构建一个n阶魔方阵所花的精力就越多。于是明明就请你帮忙,帮助他用程序来构建n阶魔方阵。

明明的问题可以归结为:给你一个阶数n,请你按照题目中描述的方法,构造出n阶魔方阵。

个人总结

用nextRow和nextCol记录下一个数的坐标,按照规则按序检查其合法性

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    bool firstCase = true;

    while (cin >> n) {
        // 创建 n×n 矩阵,初始化为0
        vector<vector<int>> magic(n, vector<int>(n, 0));

        // 初始化位置
        int row = 0;
        int col = n / 2; // 第一行中间一列

        // 依次填入 1 到 n*n
        for (int num = 1; num <= n * n; num++) {
            magic[row][col] = num;

            // 计算下一个数的位置(右上角)
            int nextRow = (row - 1 + n) % n;
            int nextCol = (col + 1) % n;

            // 检查下一个位置是否被占用
            if (magic[nextRow][nextCol] != 0) {
                // 如果被占用,则放到当前数的下面
                nextRow = (row + 1) % n;
                nextCol = col;
            }

            
            row = nextRow;
            col = nextCol;
        }

       
        if (!firstCase) {
            cout << endl;
        }
        firstCase = false;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (j > 0) cout << " ";
                cout << magic[i][j];
            }
            cout << endl;
        }
    }

    return 0;
}

计算机英语刘艺第五版unit12 英语翻译

        如果寻求(sought)人类的支持,AR可以为实体任务上的移动直播远程协作提供一个共享视觉空间。凭借这一途径,一个远程专家可以独立探索从本地用户的实时摄像机传来的场景,并且可以通过本地用户在AR视图中可见的空间注释(annotation)来进行交流。这可以通过实时视觉追踪和重建来达成,该技术不再需要事前准备和环境器材。AR远程呈现(telepresence)将视频直播会议和远程场景探索的优势聚合到了一个自然的协作界面。

2.个人信息界面

        相当多种类的AR浏览器app已经可以在手机上下载并使用了。这些app会传输和用户环境有关的兴趣点信息,将其叠加(superimpose)在设备摄像机拍摄的直播影像上。这些兴趣点既可以通过地理坐标给出并通过手机传感器(GPS,电子罗盘读数(compass readings))来识别(identify),也可以直接通过图像识别。AR浏览器有显而易见的局限性,比如可能的(potentially)糟糕的GPS准度和增强(augmentation)能力只对单独的点有效而不是对整个物体。然而(nevertheless),多亏了智能手机的普及(proliferation),这些app可以被广泛使用,并且随着社交网络功能融入AR浏览器,app的功能也在逐渐完善app的使用量也在上涨。图12b-2展示了AR浏览器“Yelp Monocle”融入了社交商业评论App“Yelp”。

        AR浏览器另一个引人注目(compelling)的使用场景是对外语的同声传译(simultaneous:同步的)。这个功能广泛存在于谷歌翻译app。用户只需选择目标语言,然后将设备的摄像机对准印刷文本;翻译结果就会叠加显示在图像上。

AI翻译对比

        若需寻求人工支持,AR能够为物理任务中的实时移动远程协作提供一个共享的视觉空间。采用这种方式,远程专家可以独立于本地用户当前的摄像头视角来探索现场,并通过空间标注进行沟通——这些标注会立即在本地用户的AR视图中显现。这一切可通过实时视觉追踪与重建技术实现,无需对工作环境进行预先布置或安装特殊设备。AR远程在场将实时视频会议远程场景探索的优势融为一体,构建出一个自然的协作界面

2. 个人信息显示

        目前,智能手机上已有大量各类AR浏览器应用可供使用。这类应用旨在将与用户环境中兴趣点相关的信息,叠加在设备摄像头拍摄的实时视频画面上。这些兴趣点要么通过地理坐标给出,并借助手机传感器(GPS、电子罗盘读数)来识别;要么通过图像识别来辨识。

AR浏览器存在明显的局限性,例如GPS精度可能不佳,且增强能力仅限于单个点而非完整的物体对象。然而,得益于智能手机的普及,这类应用已随处可见;并且,由于AR浏览器内置了社交网络功能,其使用量正不断增长。

图12B-2展示的是集成在商业点评社交应用Yelp中的AR浏览器 Yelp Monocle

AR浏览的另一个引人注目的用例:外语实时翻译

这一功能如今已在谷歌翻译应用中广泛可用。用户只需选择目标语言,并将设备摄像头对准印刷文本,翻译结果便会叠加显示在图像之上

计算机英语单词扇贝打卡

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐