XTU OJ 1267 Matrix 详解

发布于:2022-11-08 ⋅ 阅读:(711) ⋅ 点赞:(0)

Matrix

题目描述

一个矩阵An×m,矩阵按行依次为1∼nm。若干种指令,指令集如下: (以3×3的初始矩阵为例,结果矩阵列中为初始矩阵执行这条指令后的矩阵结果)

指令 含义 指令示例 结果矩阵
IN n m 初始化为n×m的矩阵 IN 3 3 1 2 3
4 5 6
7 8 9
SR x y 交换矩阵的x,y行 SR 1 2 4 5 6
1 2 3
7 8 9
SC x y 交换矩阵的x,y列 SC 1 2 2 1 3
5 4 6
8 7 9
TR 矩阵转置 TR 1 4 7
2 5 8
3 6 9
FR 上下镜像反转 FR 7 8 9
4 5 6
1 2 3
FC 左右镜像反转 FC 3 2 1
6 5 4
9 8 7
PR 输出矩阵 PR 1 2 3
4 5 6
7 8 9

现在给你一个合法的指令序列(条数不超过1000,矩阵行列最大不超过10),请执行对应指令。

输入

每行输入一条指令。

输出

对于每个PR命令,输出矩阵。矩阵元素之间有一个空格,行末无空格,最后输出一个空行。

样例输入

IN 3 3
SR 1 2
PR
SC 1 2
TR
PR
FR 
FC 
PR

样例输出

4 5 6
1 2 3
7 8 9

5 2 8
4 1 7
6 3 9

9 3 6
7 1 4
8 2 5

解题思路:

首先对于以上这些矩阵变化指令,我们可以分别定义函数去实现,然后在主函数中对其实现调用,当然,你也可以不采用定义函数的方式,只是个人不太推荐。

注意输出要求:

对于每个PR命令,输出矩阵。矩阵元素之间有一个空格,行末无空格,最后输出一个空行。

最后输出一个空行。这个值得注意,如果你最后pe,那大概就是这里出错。

最后就是实现思路:

#include<stdio.h>
int lbl[15][15];            /*函数我是自己随意写的函数名*/
char zbm[5];                /*用于读取输入指令*/
int n,m,t,x,y,temp;            /*temp用于保存中间变量*/
void in()
{
    int number=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            lbl[i][j]=number;
            number++;
        }
    }
}
void sr()
{
    for(int i=1;i<=m;i++){        //个人对于矩阵的输入输出都是从1开始,便于理解
        t=lbl[x][i];                 
        lbl[x][i]=lbl[y][i];        
        lbl[y][i]=t;
    }
}
void sc()
{
    for(int i=1;i<=n;i++){
        t=lbl[i][x];
        lbl[i][x]=lbl[i][y];
        lbl[i][y]=t;
    }
}
void tr()
{
    int a[15][15];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            a[j][i]=lbl[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            lbl[j][i]=a[j][i];
        }
    }
    t=m;                /*转置之后矩阵的行数和列数交换*/
    m=n;
    n=t;
}
void fr()
{
    for(int i=1;i<=n/2;i++){
        for(int j=1;j<=m;j++){
            temp=lbl[i][j];
            lbl[i][j]=lbl[n+1-i][j];
            lbl[n+1-i][j]=temp;
        }
    }
}
void fc()
{
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m/2;j++){
            temp=lbl[i][j];
            lbl[i][j]=lbl[i][m+1-j];
            lbl[i][m+1-j]=temp;
        }
    }
}
void pr()
{
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            printf("%d",lbl[i][j]);
            if(j!=m){
                printf(" ");
            }
        }
        printf("\n");
    }
    printf("\n");
}
int main()
{
    while(scanf("%s",zbm)!=EOF){
        if(zbm[0]=='I'&&zbm[1]=='N'){
            scanf("%d %d",&n,&m);
            in();
        }
        else if(zbm[0]=='S'&&zbm[1]=='R'){
            scanf("%d %d",&x,&y);
            sr();
        }
        else if(zbm[0]=='S'&&zbm[1]=='C'){
            scanf("%d %d",&x,&y);
            sc();
        }
        else if(zbm[0]=='T'&&zbm[1]=='R'){
            tr();
        }
        else if(zbm[0]=='F'&&zbm[1]=='R'){
            fr();
        }
        else if(zbm[0]=='F'&&zbm[1]=='C'){
            fc();
        }
        else if(zbm[0]=='P'&&zbm[1]=='R'){
            pr();
        }
    }
    return 0;
}

题目没啥难得,注意细心点,基本本地样例过了全局就能过。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到