华为OD机试-贪吃蛇

 题目描述

【贪吃蛇】贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。

下面让我们来完成贪吃蛇游戏的模拟:
给定一个NM的数组ar,代表NM个方格组成的版图,贪吃蛇每次移动一个方格。若ar[i][j]=='H',表示该方可为贪吃蛇的起始位置;若ar[i][j]=='F',表示该方格为食物,若ar[i][j]=='E',表示该方格为空格。
贪吃蛇初始长度为1,初始移动方向为向左。输入为给定一系列贪吃蛇的移动操作,返回操作后蛇的长度,如果在操作执行完之前已经游戏结束,返回游戏结束时贪吃蛇的长度。
贪吃蛇移动、吃食物和碰撞处理的细节见下面图示:
 

华为OD机试-贪吃蛇_第1张图片


图一
 

华为OD机试-贪吃蛇_第2张图片


图二
 

华为OD机试-贪吃蛇_第3张图片


图三
 

华为OD机试-贪吃蛇_第4张图片


图四
 

华为OD机试-贪吃蛇_第5张图片


图五
 

华为OD机试-贪吃蛇_第6张图片


图六

图 1:截取了贪吃蛇移动的一个中间状态,H表示蛇头,F表示食物,数字为蛇身体各节的 编号,蛇为向左移动,此时蛇头和食物已经相邻。

图 2:蛇头向左移动一格,蛇头和食物重叠,注意此时食物的格子成为了新的蛇头,第 1节 身体移动到蛇头位置,第 2节身体移动到第 1节身体位置,以此类推,最后添加第 4节升 起到原来第 3节身体的位置。

图 3:蛇头继续向左移动一格,身体的各节按上述规则移动,此时蛇头已经和边界相邻,但 还未碰撞。

图 4:蛇头继续向左移动一格,此时蛇头已经超过边界,发生碰撞,游戏结束。

图 5和图 6给出一个蛇头和身体碰撞的例子,蛇为向上移动。图 5时蛇头和第 7节身体相 邻,但还未碰撞;图 6蛇头向上移动一格,此时蛇头和第 8节身体都移动到了原来第 7节 身体的位置,发生碰撞,游戏结束。

输入描述

输入第 1行为空格分隔的字母,代表贪吃蛇的移动操作。字母取值为 U、D、L、R、G,其中U、D、L、R分别表示贪吃蛇往上、下、左、右转向,转向时贪吃蛇不移动,G表示贪吃蛇按 当前的方向移动一格。用例保证输入的操作正确。
第 2行为空格分隔的两个数,指定为 N和 M,为数组的行和列数。余下 N行每行是空格分 隔的 M个字母。字母取值为 H、F和 E,H表示贪吃蛇的起始位置,F表示食物,E表示该 方格为空。用例保证有且只有一个 H,而 F和 E会有多个。

输出描述

输出一个数字为蛇的长度。

示例一

输入

DGG
33
FFF
FFH
EFE

输出

1

代码实现

# coding:utf-8
# 贪吃蛇
# https://blog.nowcoder.net/n/42420d1a2d324c32838f7f23e4da45f3
import sys

try:
    while True:
        a1 = sys.stdin.readline().strip()
        a2 = []
        n, m = [int(x) for x in input('input N M:').split(' ')]
        for i in range(n):
            a2.append(input(f'input {i + 1} line:').split(' '))
        start = (0, 0)
        for i in range(n):
            for j in range(m):
                if a2[i][j] == 'H':
                    a2[i][j] == 'E'
                    start = (i, j)
        body = [start]
        direction = 'L'
        for c in a1:
            if c in 'UDLR':
                direction = c
            elif c == 'G':
                if direction == 'U':
                    next = (body[0][0] - 1, body[0][1])
                elif direction == 'D':
                    next = (body[0][0] + 1, body[0][1])
                elif direction == 'L':
                    next = (body[0][0], body[0][1] - 1)
                elif direction == 'R':
                    next = (body[0][0], body[0][1] + 1)
                if next[0] < 0 or next[1] < 0 or next[0] > n - 1 or next[1] > m - 1 or next in body[:-1]:
                    # print(len(body))
                    break
                if a2[next[0]][next[1]] == 'E':
                    body = [next] + body[:-1]
                elif a2[next[0]][next[1]] == 'F':
                    body = [next] + body[:]
        print(len(body))

except:
    pass

你可能感兴趣的:(测试小兵,华为od,算法,python,华为机试,贪吃蛇)