模拟题
做模拟题一般来说都是只要题目读懂了,知道了它的“动作”,就是他的核心操作,再把他的操作流程依次用代码呈现出来就完成了
这道题思路是用两个数组,一个结果数组,一个辅助数组,对结果数组以辅助数组为模板做核心操作,一次转置下来,再用结果数组更新辅助数组,循环这个流程,最后得到最终的结果数组。
核心操作:以x行y列为中心的2r+1阶矩阵按照某种时针方向旋转
可以手推一下发现规律:
顺时针的转置为: res[x-r+i][y-r+j] = fl[x-r+j][y+r-i];
逆时针的转置为:res[x-r+i][y-r+j] = fl[x+r-j][y-r+i];
代码如下:
#include<bits/stdc++.h> //万能头文件
using namespace std;
const int maxn = 505;
// 数组res为最后输出的结果数组,fl为辅助数组;
int res[maxn][maxn], fl[maxn][maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
int i, j, k = 1;
for(i = 1; i<=n; i++){
for(j = 1; j<=n; j++){
fl[i][j] = res[i][j] = k++;//为res,fl数组赋值;
}
}
//x为行,y为列,(2*r+1)为转置的范围,w为方向;
int x, y, r, w;
while(m--){
scanf("%d%d%d%d",&x,&y,&r,&w);
int len = 2*r+1;
for(int i = 0; i<len; i++){
for(int j = 0; j<len; j++){
//顺时针
if(w) res[x-r+i][y-r+j] = fl[x-r+j][y+r-i];
//逆时针
else res[x-r+i][y-r+j] = fl[x+r-j][y-r+i];
}
}
//更新辅助数组
for(int i = 1; i<=n;i++){
for(int j =1; j<=n; j++) fl[i][j] = res[i][j];
}
}
//输出结果
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
printf("%d ", res[i][j]);
}
printf("\n");
}
//好习惯
return 0;
}
有什么不好的地方可以指出,共同进步。