广东工业大学ACM程序设计大赛 旋转矩阵

本文介绍了一个旋转矩阵的问题解决方法,通过定义右旋为+1、左旋为+3,并使用取模运算确定最终旋转状态。文章详细展示了如何实现矩阵右旋的坐标转换,并提供了完整的C++代码实现。

题目链接:点击打开链接

题意:旋转矩阵

题解:可以定义右旋为+1,左旋为+3,最终结果对 4 取模就知道旋转结果。右旋 2 次、左旋 1 次可以 当做右旋 2、3 次处理,所以只要写出矩阵右旋 操作的函数就可以了。矩阵右旋坐标转换公式: a[i][j]=b[j][n-1-i],a 是原矩阵,b 是右旋的矩阵, n 是总行数,m 是总列数(a[n][m])。注意“-” 和“|”也要变形

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50;
int main(){
	int z;
	cin >> z;
	while(z--){
		int n,m;
		cin >> n >> m;
		char q[maxn][maxn];
		char b[1005];
		for(int i = 0 ; i < n ; i ++){
			scanf("%s",q[i]);
		}
		scanf("%s",b);
		int len = strlen(b);
		int num = 0;
		for(int i = 0 ; i < len ; i ++){
			if(b[i] == 'R')
				num ++;
			else 
				num --;
		}
		 num = (num %4 +4)%4;
		if(num%2 == 1){
			for(int i = 0 ; i < n ; i ++){
				for(int j = 0 ; j < m ; j ++){
				//	cout << q[i][j];
					if(q[i][j] == '-')
						q[i][j] = '|';
					else if(q[i][j] == '|')
						q[i][j] = '-';
				}
				//cout << endl;
			}
			swap(n,m);
			cout << n << " " << m << endl;
		}
		else {
			cout  << n << " " << m << endl; 
		}
		if(num == 0){
			for(int i = 0 ; i < n ; i ++){
				for(int j = 0 ; j < m ; j ++)
					cout << q[i][j] ;
				cout << endl;
			}
		}
		else if(num == 1){
		//	cout << n  << " " << m << endl;
			for(int i = 0 ; i < n ; i ++){
				for(int j = m -1 ; j >= 0 ; j --)
					cout << q[j][i] ;
				cout << endl;
			}
		}
		else if(num == 2){
			for(int i = n-1 ; i >= 0 ; i --){
				for(int j = m - 1 ; j >= 0 ; j --)
					cout << q[i][j] ;
				cout << endl;
			}
		}
		else if(num == 3){
			for(int i = n-1 ; i >= 0 ; i --){
				for(int j = 0 ; j < m  ; j ++)
					cout << q[j][i] ;
				cout << endl;
			}

		}			cout << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值