1097 矩阵行平移 20分 知识点:模拟,数组

363 阅读2分钟

题目:1097 矩阵行平移 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:PAT乙级 1097 矩阵行平移_哔哩哔哩_bilibili

坑点: image.png

思想

这道题是一道模拟题,考察对数组的元素的挪动。

我们拿样例举例:

首先第一个奇数行(1)挪动一个元素

第二个奇数行(3),挪动两个元素

第三个奇数行(5),挪动3个元素,这时候因为3超出了k值(k为2),所以需要3%k=1,只需要挪动1个元素

第四个奇数行(7),继续需要挪动4个元素,超K,%k=2,需要挪动两个元素。

往后的所有奇数行需要挪动的元素如果超过了k,都需要%k得到一个新值u,这个u就是需要挪动的元素。

#include<bits/stdc++.h>
using namespace std;
int g[105][105];
int main()
{
    int n,k,x;cin>>n>>k>>x;

    //输入
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>g[i][j];
        }
    }
    int count=0;

    //遍历
    for(int i=0;i<n;i+=2)
    {  
        //第一个奇数行移动1位。第二个移动2位
        int u=count%k;

        //从最后一位开始,前面的往后挪
        for(int j=n-1;j>u;j--)
        {
            g[i][j]=g[i][j-1-u];  //-1是为了确保当%k的时候至少还可以挪一位
        }  
        count++;  //count要每奇数行++
         
        //填充
        for(int j=0;j<=u;j++)  //上面是从u的位置开始挪的,因此这里要把u补上
        {
            g[i][j]=x;
        }
     
    }

    // //输出矩阵  (检验)
    // for(int i=0;i<n;i++)
    // {
    //     for(int j=0;j<n;j++)
    //     {
    //         cout<<g[i][j]<<" ";
    //     }
    //     cout<<endl;
    // }

  
   //计算每一列的和
    for(int i=0;i<n;i++)
    {   int sum=0;
        for(int j=0;j<n;j++)
        {
            sum+=g[j][i];
        }
     if(i==0)cout<<sum;
    else cout<<" "<<sum;
    }
    return 0;
}#include<bits/stdc++.h>
using namespace std;
int g[105][105];
int main()
{
    int n,k,x;cin>>n>>k>>x;

    //输入
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>g[i][j];
        }
    }
    int count=0;

    //遍历
    for(int i=0;i<n;i+=2)
    {  
        //第一个奇数行移动1位。第二个移动2位
        int u=count%k;

        //从最后一位开始,前面的往后挪
        for(int j=n-1;j>u;j--)
        {
            g[i][j]=g[i][j-1-u];  //-1是为了确保当%k的时候至少还可以挪一位
        }  
        count++;  //count要每奇数行++
         
        //填充
        for(int j=0;j<=u;j++)  //上面是从u的位置开始挪的,因此这里要把u补上
        {
            g[i][j]=x;
        }
     
    }

    // //输出矩阵  (检验)
    // for(int i=0;i<n;i++)
    // {
    //     for(int j=0;j<n;j++)
    //     {
    //         cout<<g[i][j]<<" ";
    //     }
    //     cout<<endl;
    // }

  
   //计算每一列的和
    for(int i=0;i<n;i++)
    {   int sum=0;
        for(int j=0;j<n;j++)
        {
            sum+=g[j][i];
        }
     if(i==0)cout<<sum;
    else cout<<" "<<sum;
    }
    return 0;
}