CF 400C - Inna and Huge Candy Matrix

坐标系的转换- -!

顺时针(x,y)-->(y,n+1-x)-->(n+1-x,m+1-y)-->(m+1-y,x)

有很多细节:

1.xk=yk,yk=n+1-xk这样是错的,xk已经变换了

2.如果又有正旋又有逆旋,要考虑n,m的旋转

3.不能直接选择n,m,不然下个坐标的n,m是错乱的

#include<iostream>
#include<stdio.h>
using namespace std;

int n,m,x,y,z,p,xk,yk;
void trans(int xk,int yk){
	int tx,ty,tn=n,tm=m;
	if(x){
		if(x==1)
			tx=yk,ty=n+1-xk;
		else if(x==2)
			tx=n+1-xk,ty=m+1-yk;
		else if(x==3)
			tx=m+1-yk,ty=xk;
		xk=tx,yk=ty;
		if(x%2)//--转了以后行列变化
			swap(tn,tm);
	}
	//printf("%d %d\n",xk,yk);
	if(y==1)
		yk=tm+1-yk;
	//printf("%d %d\n",xk,yk);
	if(z){
		if(z==1)
			tx=tm+1-yk,ty=xk;
		else if(z==2)
			tx=tn+1-xk,ty=tm+1-yk;
		else if(z==3)
			tx=yk,ty=tn+1-xk;
		xk=tx,yk=ty;
	}
	printf("%d %d\n",xk,yk);
}
int main(){
	cin>>n>>m>>x>>y>>z>>p;
	x%=4;y%=2;z%=4;
	for(int i=0;i<p;i++){
		scanf("%d %d",&xk,&yk);
		trans(xk,yk);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值