题目描述
一个矩阵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),请执行对应指令。
我的思路:
这题就是个纸老虎,第一次看到的时候有没有被吓到,不要想着难,其实蛮简单的
wa可能就是转置错了,可以试试两次TR,转置的转置等于本身
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(void)
{
char cmd[3];
int sum[11][11];
int i,j,flag,n,m,x,y,count,z,t;
while (scanf("%s",&cmd)!=EOF)
{
if (cmd[0]=='I'&&cmd[1]=='N') flag=1;
if (cmd[0]=='S'&&cmd[1]=='R') flag=2;
if (cmd[0]=='S'&&cmd[1]=='C') flag=3;
if (cmd[0]=='T'&&cmd[1]=='R') flag=4;
if (cmd[0]=='F'&&cmd[1]=='R') flag=5;
if (cmd[0]=='F'&&cmd[1]=='C') flag=6;
if (cmd[0]=='P'&&cmd[1]=='R') flag=7;
if (flag==1)//IN
{
count=1;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
sum[i][j]=count;
count++;
}
}
}
else if (flag==2)//SR
{
scanf("%d %d",&x,&y);
for (i=1;i<=m;i++)
{
t=sum[x][i];
sum[x][i]=sum[y][i];
sum[y][i]=t;
}
}
else if (flag==3)//SC
{
scanf("%d %d",&x,&y);
for (i=1;i<=n;i++)
{
t=sum[i][x];
sum[i][x]=sum[i][y];
sum[i][y]=t;
}
}
else if (flag==4)//TR(感觉我的思路有点笨)
{
int temp[13][13];
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++) temp[i][j]=sum[i][j];
}
z=n;
n=m;
m=z;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++) sum[i][j]=temp[j][i];
}
}
else if (flag==5)//FR
{
for (i=1;i<=n/2;i++)
{
for (j=1;j<=m;j++)
{
t=sum[i][j];
sum[i][j]=sum[n+1-i][j];
sum[n+1-i][j]=t;
}
}
}
else if (flag==6)//FC
{
for (i=1;i<=n;i++)
{
for (j=1;j<=m/2;j++)
{
t=sum[i][j];
sum[i][j]=sum[i][m+1-j];
sum[i][m+1-j]=t;
}
}
}
else if (flag==7)//PR
{
for(i=1;i<=n;i++)
{
for(j=1;j<m;j++) printf("%d ",sum[i][j]);
printf("%d\n",sum[i][m]);
}
printf("\n");//题目要求
}
}
return 0;
}