在一个遥远的魔法世界里,有一种特殊的魔法迷宫。这个迷宫是由 N×M
个房间组成的二维方阵,每个房间都有一个数字。但是,这个迷宫有一个神奇的地方,那就是它可以根据魔法师的指令来翻转。指令有两种:
一种是 ud,代表上下翻转, 1234→3412
一种是 lr,代表左右翻转, 1234→2143
现在,你是一个正在学习魔法的小巫师。你想测试一下你的翻转魔法能力,因此你将自己投入到这个迷宫中。你的任务是,给定一个二维的迷宫(一个二维数组),和一系列的翻转指令,以 end 结束,你需要将迷宫进行翻转,最后返回翻转后的迷宫。
注意:二维迷宫是 N×M
的形式,M
和 N
不一定相等。
输入格式
第一行两个整数,N
,M
。 接下来 N
行,每行 M
个整数,表示迷宫内每个房间中的数字。
接下来若干行,每行一个字符串,ud 或者 lr 表示上下翻转或者左右翻转,end 表示结束。
输出格式
N
行 M
列数字,表示旋转后迷宫的样子。
样例输入
6 9
2 7 1 6 6 2 8 1 7
0 2 6 2 7 8 4 6 5
5 6 4 1 6 3 4 5 2
4 2 6 5 0 0 2 3 0
9 1 5 7 5 9 2 6 4
5 4 0 6 5 6 4 0 4
ud
ud
lr
lr
ud
end
样例输出
5 4 0 6 5 6 4 0 4
9 1 5 7 5 9 2 6 4
4 2 6 5 0 0 2 3 0
5 6 4 1 6 3 4 5 2
0 2 6 2 7 8 4 6 5
2 7 1 6 6 2 8 1 7
样例说明
上下翻转了三次相当于翻转了一次,左右翻转了两次相当于没有翻转。
数据范围
1≤N,M≤100
对于 80%
的数据,指令数量 ≤105
对于 100%
的数据,指令数量 ≤106
这里指令数量表示 ud 或者 lr 的总数量
【以下回答由 GPT 生成】
给定一个二维迷宫和一系列的翻转指令,要求根据指令将迷宫进行翻转并输出。
我们可以通过使用两个布尔变量isUpsideDown
和isLeftRight
来判断当前的迷宫是否需要上下翻转或左右翻转。
根据输入的指令,我们可以检查每个指令的字符,如果是'u'则将isUpsideDown
取反,如果是'l'则将isLeftRight
取反。如果是'e'则终止输入指令。对于每个房间,如果isUpsideDown
为真,则交换迷宫的上下两行;如果isLeftRight
为真,则交换迷宫的左右两列。
maze
来表示迷宫。maze
中。isUpsideDown
和isLeftRight
为假。isUpsideDown
取反。isLeftRight
取反。isUpsideDown
为真,则交换迷宫的上下两行。isLeftRight
为真,则交换迷宫的左右两列。N, M = map(int, input().split())
maze = []
for _ in range(N):
row = list(map(int, input().split()))
maze.append(row)
isUpsideDown = False
isLeftRight = False
while True:
command = input().strip()
if command == 'end':
break
for char in command:
if char == 'u':
isUpsideDown = not isUpsideDown
elif char == 'l':
isLeftRight = not isLeftRight
if isUpsideDown:
for i in range(N//2):
maze[i], maze[N-i-1] = maze[N-i-1], maze[i]
if isLeftRight:
for i in range(N):
for j in range(M//2):
maze[i][j], maze[i][M-j-1] = maze[i][M-j-1], maze[i][j]
for row in maze:
print(' '.join(map(str, row)))
该算法中,读取输入需要O(N*M)的时间和空间。处理指令需要O(K)的时间,其中K是指令数量。最后输出迷宫需要O(N*M)的时间。
综上,算法的时间复杂度是O(N*M+K),空间复杂度是O(N*M),其中N和M分别是迷宫的行数和列数。
【相关推荐】