洛谷--P4924

P4924

模拟题

做模拟题一般来说都是只要题目读懂了,知道了它的“动作”,就是他的核心操作,再把他的操作流程依次用代码呈现出来就完成了

这道题思路是用两个数组,一个结果数组,一个辅助数组,对结果数组以辅助数组为模板做核心操作,一次转置下来,再用结果数组更新辅助数组,循环这个流程,最后得到最终的结果数组。

核心操作:以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;
}

有什么不好的地方可以指出,共同进步。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值