您的位置:首页 > 其它

codeforces 400C - Inna and Huge Candy Matrix(耐心找规律,细节还是要注意的)

2014-03-06 11:47 501 查看
1、http://codeforces.com/problemset/problem/400/C

2、题目大意:

给出一个n*m的矩阵,其中有p个格子里边有糖果,知道这p个格子现在的位置,现在要将这个n*m的矩阵顺时针旋转x次,水平翻转y次,逆时针旋转z次,最后输出原来的p个有糖果的格子现在的坐标

3、解题思路:

数据很大,首先能明白的是顺时针和逆时针旋转4次回归原来的,水平旋转2次回归原来的,所以x,y,z的大小最大是4即可,光明白这一点只能将大数据转换成小数据了,但是还是不能解决问题的,那么我们现在要做的就是拿一个矩阵旋转看他们坐标的变化,找出规律,我是用2*3举证做的

规律如下:(假设当前处理的坐标是(x,y))

顺时针旋转一次(x,y)--->(y,n+1-x)

顺时针旋转二次(x,y)--->(n+1-x,m+1-y)

顺时针旋转三次(x,y)--->(m+1-y,x)

顺时针旋转四次(x,y)--->(x,y)

水平翻转一次(x,y)--->(x,m+1-y)

水平翻转一次(x,y)--->(x,y)

逆时针旋转一次(x,y)--->(m+1-y,x)

逆时针旋转二次(x,y)--->(n+1-x,m+1-y)

逆时针旋转三次(x,y)--->(y,n+1-x)

逆时针旋转四次(x,y)--->(x,y)

有了这些就足够了,再稍微注意一下细节,就AC了

4、AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n,m,X,Y,Z,p;
int x,y;
while(scanf("%d%d%d%d%d%d",&n,&m,&X,&Y,&Z,&p)!=EOF)
{
X%=4;
Y%=2;
Z%=4;
int tn=n;
int tm=m;
for(int i=1;i<=p;i++)
{
n=tn;
m=tm;
scanf("%d%d",&x,&y);
if(X==1)
{
int xx=x;
x=y;
y=n+1-xx;
int nn=n;
n=m;
m=nn;
}
else if(X==2)
{
x=n+1-x;
y=m+1-y;

}
else if(X==3)
{
int xx=x;
x=m+1-y;
y=xx;
int nn=n;
n=m;
m=nn;
}
if(Y==1)
{
y=m+1-y;
}
if(Z==1)
{
int xx=x;
x=m+1-y;
y=xx;
int nn=n;
n=m;
m=nn;
}
else if(Z==2)
{
x=n+1-x;
y=m+1-y;
}
else if(Z==3)
{
int xx=x;
x=y;
y=n+1-xx;
int nn=n;
n=m;
m=nn;
}
printf("%d %d\n",x,y);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: