首页 > 试题广场 >

操作矩形

[编程题]操作矩形
  • 热度指数:620 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

平面上有一个矩形,大小为n×m,其中,长度为n的边是竖直的,长度为m的边是水平的。将矩形切割成n×m个小正方形,规定左上角的小正方形坐标为,左下角的小正方形坐标为,右上角的小正方形坐标为,右下角的小正方形坐标为。从上往下数第x行,从左往右数第列的小正方形坐标为(x,y).

现在,我们对这个矩形进行如下操作,将其顺时针旋转90度x次,然后将其水平翻转y次,然后将其逆时针旋转90度z次。

接着,我们将这个操作后的矩形重新标上坐标,每一个小正方形就有一个原来的坐标和新的坐标。

然后有Q个询问,每一次询问一个原来坐标为的小正方形的新坐标。你需要对所有询问作出回答。


输入描述:

输入第一行包含三个数x ,y ,z ,代表顺时针旋转,水平翻转,逆时针旋转的次数。

接下来一行两个数,n,m代表原矩形的大小。

接下来一行一个数,Q代表询问次数。

接下来Q行,每行两个数x,y,代表一次询问,询问原矩形中坐标为(x,y)的点现在的新坐标



输出描述:

输出包含Q行,每一行一个答案。  

示例1

输入

1 1 1
4 5
3
1 1
3 4
2 5

输出

4 1
2 4
3 5

说明

# point[0n,1m,2x,3y]
# 水平翻转,nm不变,翻转一次换y坐标,x坐标不变
def levelreverse(point):
    p0 = point
    p0[3] = point[1] - point[3] + 1    
    return p0

def Rotation90(point):
    p0 = []
    p0.append( point[1])
    p0.append( point[0])
    p0.append( point[3])
    p0.append( point[0] -  point[2] + 1)
    return p0

# xyz[0顺90,1水平,2逆90]
xyz = list(map(int, input().split())) 
nm = list(map(int, input().split())) 
Q = int(input())

while Q:
    pq = list(map(int, input().split()))
    point = []
    point = point + nm + pq

    for i in range( (xyz[0]+4)%4 ):
        point = Rotation90(point)

    if (xyz[1]+2)%2 == 1: 
        point = levelreverse(point)

    for i in range((8-((xyz[2]+4)%4))%4):
        #print(i)
        point = Rotation90(point)

    outp = list(map(str, point[2:4]))
    print(' '.join(outp))
    Q -=1

发表于 2022-08-31 22:44:53 回复(0)