Description
一个矩阵A(n×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),请执行对应指令。
Input
每行输入一条指令。
Output
对于每个PR命令,输出矩阵。矩阵元素之间有一个空格,行末无空格,最后输出一个空行。
Sample Input
IN 3 3
SR 1 2
PR
SC 1 2
TR
PR
FR
FC
PR
Sample Output
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
解题思路:
按题意直接模拟即可。
#include<bits/stdc++.h>
using namespace std;
int a[11][11],b[11][11];
int temp[11];
int n,m;
void swapR(int x,int y)
{
for(int i=1; i<=m; i++) temp[i]=a[x][i];
for(int i=1; i<=m; i++) a[x][i]=a[y][i];
for(int i=1; i<=m; i++) a[y][i]=temp[i];
}
void swapC(int x,int y)
{
for(int i=1; i<=n; i++) temp[i]=a[i][x];
for(int i=1; i<=n; i++) a[i][x]=a[i][y];
for(int i=1; i<=n; i++) a[i][y]=temp[i];
}
int main()
{
int x,y;
char order[5];
while(~scanf("%s",order))
{
if(strcmp(order,"IN") == 0)
{
cin>>n>>m;
int num=0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
a[i][j]=++num;
}
}
else if(strcmp(order,"SR") == 0)
{
cin>>x>>y;
swapR(x,y);
}
else if(strcmp(order,"SC") == 0)
{
cin>>x>>y;
swapC(x,y);
}
else if(strcmp(order,"TR") == 0)
{
for(int j=1; j<=m; j++)
{
for(int i=1; i<=n; i++)
b[j][i]=a[i][j];
}
swap(n,m);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
a[i][j]=b[i][j];
}
}
else if(strcmp(order,"FR") == 0)
{
for(int i=1,j=n; i<=n/2; i++,j--)
swapR(i,j);
}
else if(strcmp(order,"FC") == 0)
{
for(int i=1,j=m; i<=m/2; i++,j--)
swapC(i,j);
}
else if(strcmp(order,"PR") == 0)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
cout<<a[i][j]<<(j==m ? '\n' : ' ');
}
cout<<endl;
}
}
return 0;
}