解题思路:
1.由题可得,需要将一个矩阵按照字符来进行不同旋转,顺时针,逆时针,左右反转,上下反转,在之前的题目中,已经做过类似的题,首先观察转置后的矩阵元素,标明他在原数组中的位置,然后根据内循环,外循环的下标变化,来依次填写
2.在这种问题中,为了避免数值覆盖,通常设置一个辅助数组,保持和原数组一样的数据,在赋值过程中,数组b提供数值,数组a存放结果,存放完后,将数组a再次赋值给数组b,为下一次变化做准备
3.本题的坑点在于m和n是不一样的,在进行顺时针或者逆时针旋转后,很明显矩阵的行数和列数发生了颠倒,所以,每次矩阵转化完后,行数和列数都要更新,根据x和y的自增去赋值给转置后的矩阵的行数列数即可
4.最后输出二维数组a
#include<bits/stdc++.h>
using namespace std;
int a[105][105],b[105][105];
int m,n; //m行n列设置成全局变量
void zhuanhua(char ans)//无返回的值的含参函数
{
int x=0,y=0,flag;//x和flag分别表示记录转化后矩阵的行和列
if(ans=='A')//如果是顺时针旋转的话
{
for(int j=1;j<=n;j++)
{
x++;//行数累加
for(int i=m;i>=1;i--)
{
y++;//列数累加
a[x][y]=b[i][j];
}//将对应的数组b中的内容复制给a数组的挨个位置
flag=y;//将列数赋值给flag
y=0;
}
}
else if(ans=='B')
{
for(int j=n;j>=1;j--)
{
x++;
for(int i=1;i<=m;i++)
{
y++;
a[x][y]=b[i][j];
}
flag=y;
y=0;
}
}
else if(ans=='C')
{
for(int i=1;i<=m;i++)
{
x++;
for(int j=n;j>=1;j--)
{
y++;
a[x][y]=b[i][j];
}
flag=y;
y=0;
}
}
else
{
for(int i=m;i>=1;i--)
{
x++;
for(int j=1;j<=n;j++)
{
y++;
a[x][y]=b[i][j];
}
flag=y;
y=0;
}
}
m=x;//将行数赋值给m
n=flag;//将列数赋值给n
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
b[i][j]=a[i][j];//数组a赋值给数组b
return ;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];//将数据输入到二维数组中
b[i][j]=a[i][j];//将数组a中的内容拷贝到数组b中
}
string b;
cin>>b;//输入字符串b
for(int i=0;i<=b.length()-1;i++)//遍历每个字符
{
zhuanhua(b[i]);//执行zhuanhua函数
}
for(int i=1;i<=m;i++)//输出二维数组
{
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}