首页 > 试题广场 >

小美的新游戏

[编程题]小美的新游戏
  • 热度指数:2456 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小美和小团合作开发了一款新游戏!他们相信这款游戏一定可以大火。

游戏规则是这样的,现在有一个方格地图,你控制一个机器人位于初始位置(x, y),然后你可以向上下左右的地块移动。其中一些地块上会有得分点,经过这些点可以获得分数。当然,路上还会有一些陷阱点,如果想要通过陷阱点,就需要付出一定的分数来清除这个陷阱点。注意陷阱点付出分数清除后就会变成普通的地块。即反复经过陷阱点只需付出一次代价。同样的,得分点也只能获得一次分数。

 

小美想到了一个策划案来让这个游戏变得难一些。小美把地图和机器人的初始位置给了小团,并且告诉了小团他操控机器人的行进路线。小美想试试小团能不能算出来他的最终得分。

小团完美地完成了这个任务。现在,小美和小团想找一些测试人员看看这款游戏的难度如何。他们找到了你,希望你帮他们测试一下这个游戏。而你能否挑战成功呢?

 

注意分数允许为负。初始分数为0.


输入描述:

第一行四个整数N,M,P,Q,表示这张地图是N行M列的,得分点的得分是P,陷阱点清除的代价是Q。

接下来N行,每行M个字符,表示这张地图。其中,字符S表示初始机器人位置。字符#表示墙壁,字符O代表得分点。字符X代表陷阱点。字符+代表普通的地块。

 

接下来一行一个连续的字符串表示机器人的移动路线,只由大写字母WASD构成,W向上,A向左,S向下,D向右。机器人可以上下左右移动。不能超出地图边界。也不能走到墙壁之上。试图走出边界和走到墙壁的行动会停留在原来的位置不动。

 



输出描述:

一个整数,表示小团的机器人最终获得了多少分

示例1

输入

6 6 20 10
S#++O#
OXX#X#
++++++
###XX#
++#O#+
OXO++X
SSDDDDDAWWSSSAWSSSADDD

输出

40

备注:

其中地图大小对全体数据都有1<=N,M<=500

对于得分点分数和陷阱点分数P和Q对全体数据都有1<=P,Q<=1000

接下来是机器人行进路线,对于30%的测试点,有行进路线长度小于等于100;对于100%的测试点有行进路线长度小于等于100000

def creat_map(N=3, M=2):
'''创建地图的函数,分别包含以下默认参数:
行数 N
列数 M
'''
map_list = []
l = 0
while(l < N):
r = 0
line = []
line_str = input()
while r < M:
line.append(line_str[r])
r = r+1
map_list.append(line)
l = l+1

return map_list

pass

def play_game(N, M, P, Q, game_map, move):

# 搜索S初始位置
x = 0 # 行
y = 0 # 列
score = 0
for i in range(N):
for j in range(M):
if(game_map[i][j] == 'S'):
x = i
y = j
game_map[i][j] = '+'
break

# 开始从S点移动
for i in range(len(move)):
# 向上移动
if(move[i] == 'W'):
if(x > 0 and game_map[x-1][y] != '#'): # 成功移动
x = x-1
if(game_map[x][y] == 'O'):
score += P # 加分
game_map[x][y] = '+' # 变为空地
elif(game_map[x][y] == 'X'):
score -= Q # 扣分
game_map[x][y] = '+' # 变为空地
# 向下移动
elif(move[i] == 'S'):
if(x < N-1 and game_map[x+1][y] != '#'):
x = x+1
if(game_map[x][y] == 'O'):
score += P # 加分
game_map[x][y] = '+' # 变为空地
elif(game_map[x][y] == 'X'):
score -= Q # 扣分
game_map[x][y] = '+' # 变为空地
# 向左移动
elif(move[i] == 'A'):
if(y > 0 and game_map[x][y-1] != '#'):
y = y-1
if(game_map[x][y] == 'O'):
score += P # 加分
game_map[x][y] = '+' # 变为空地
elif(game_map[x][y] == 'X'):
score -= Q # 扣分
game_map[x][y] = '+' # 变为空地
# 向右移动
elif(move[i] == 'D'):
if(y < M-1 and game_map[x][y+1] != '#'):
y = y+1
if(game_map[x][y] == 'O'):
score += P # 加分
game_map[x][y] = '+' # 变为空地
elif(game_map[x][y] == 'X'):
score -= Q # 扣分
game_map[x][y] = '+' # 变为空地

print(score) # 输出结果

pass

str_nmpq = input()
str_nmpq_list = str_nmpq.split()
N = int(str_nmpq_list[0])
M = int(str_nmpq_list[1])
P = int(str_nmpq_list[2])
Q = int(str_nmpq_list[3])

game_map = creat_map(N, M)
move = input()
play_game(N, M, P, Q, game_map, move)
''' 测试地图
6 6 20 10
S#++O#
OXX#X#
++++++
###XX#
++#O#+
OXO++X
SSDDDDDAWWSSSAWSSSADDD
'''

发表于 2023-02-08 14:59:08 回复(0)