XTU,C语言,Matrix

题目描述

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

指令含义指令示例结果矩阵
IN n m初始化为n×m的矩阵IN 3 31 2 3
4 5 6
7 8 9
SR x y交换矩阵的x,y行SR 1 24 5 6
1 2 3
7 8 9
SC x y交换矩阵的x,y列SC 1 22 1 3
5 4 6
8 7 9
TR矩阵转置TR1 4 7
2 5 8
3 6 9
FR上下镜像反转FR7 8 9
4 5 6
1 2 3
FC左右镜像反转FC3 2 1
6 5 4
9 8 7
PR输出矩阵PR1 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

这道题不是很难,分别定义几个函数用来执行各个指令,再分情况调用即可。  

strcmp() 用来比较字符串(区分大小写),字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。

所以如果返回值为零,则两个字符串相同。

#include <stdio.h>
#include <string.h>
int num[12][12];
int s[12][12];
int n,m,x,y;
void IN(int n,int m)//n为行,m为列
{
    int i,j,a = 1;
    for(i= 1;i <= n;i++)
    {
        for(j = 1;j <= m;j++)
        {
            num[i][j] = a;
            a++;
        }
    }
}
void SR(int x,int y)
{
    int i,temp;
    for(i = 1;i <= m;i++)
    {
        temp = num[x][i];
        num[x][i] = num[y][i];
        num[y][i] = temp;
    }
}
void SC(int x,int y)//An×m
{
    int i,temp;
    for(i = 1;i <= n;i++)
    {
        temp = num[i][x];
        num[i][x] = num[i][y];
        num[i][y] = temp;
    }
}
void TR()
{
    int i,j,t;
    for(i = 1;i <=n;i++)//i为列,j为行
    {
        for(j = 1;j <= m;j++)
        {
            s[j][i] = num[i][j];
        }
    }
    t = m;//这里要注意,此后行数与列数也互换了
    m = n;
    n = t;
    for(i = 1;i <=n;i++)//i为列,j为行
    {
        for(j = 1;j <= m;j++)
        {
            num[i][j] = s[i][j];
        }
    }
}
void FR()
{
    int i = 1,j = n;
    while(j >= i)
    {
        SR(i,j);
        i++,j--;
    }
}
void FC()
{
    int i = 1,j = m;
    while(j >= i)
    {
        SC(i,j);
        i++,j--;
    }
}
void PR()
{
    int i,j;
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= m;j++)
        {
            if(j == m)
            {
                printf("%d\n",num[i][j]);
                break;
            }
            printf("%d ",num[i][j]);
        }
    }
    printf("\n");
}
char str[5];
int n1,m1;
int main() 
{

    while(scanf("%s",str)!=EOF)
    {
        if(strcmp(str,"IN")==0)//用strcmp函数来判断执行哪个指令
        {
            scanf("%d%d",&n,&m);
            IN(n,m);
        }
        else if(strcmp(str,"SR")==0)
        {
            scanf("%d%d",&n1,&m1);
            SR(n1,m1);
        }
        else if(strcmp(str,"SC")==0)
        {
            scanf("%d%d",&n1,&m1);
            SC(n1,m1);
        }
        else if(strcmp(str,"TR")==0)
        TR();
        else if(strcmp(str,"FR")==0)
        FR();
        else if(strcmp(str,"FC")==0)
        FC();
        else
        PR();
    }
	return 0;
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值