dotcpp 蓝桥杯2014年第五届真题-兰顿蚂蚁

题目描述
在这里插入图片描述

简单来说就是每一步改变方向,根据格子的颜色顺时针或者逆时针转动方向,向前走一步,用计算机模拟出移动的路径,基本用不到算法,只不过在调转方向时可以使用python的数据类型
输入为:
第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。

输出就是k步之后的坐标
解题思路
上下左右四个方向的调转很容易理解,可以将调转方向与向前移动一步结合,直接在原坐标的基础上朝着某个方向挪一步即可,可以定义一个列表,专门存放朝四个方向挪动时对应的x,y的操作,需要注意的是在我们每一次挪动时,都有哪些操作需要完成:
①染色,这个可以放在第一个
②转动方向,这个很重要,因为下一步还会用到,而且需要当前方向确定下一个方向,由于字典的key值不是一个可迭代对象,所以还需要开辟空间专门存放方向的轮播表,黑格是顺时针,白格是逆时针
③下一步的位置,调转方向后向前走一步,其实这是一步操作

原题链接
链接: click

python代码

m,n=map(int,input().split())
board=[]
for i in range(m):
    board.append(list(map(int,input().split())))
tmp=[]
tmp=input().split()
x,y,s,k=int(tmp[0]),int(tmp[1]),tmp[2],int(tmp[3])
#确定方向
dic_b={'U':0,'R':1,'D':2,'L':3}
dir_b=['U','R','D','L']
dic_w={'U':0,'L':1,'D':2,'R':3}
dir_w=['U','L','D','R']
#与题目所指方向不同,这里是朝某个方向挪了一步
step_b=[(-1,0),(0,1),(1,0),(0,-1)]
step_w=[(-1,0),(0,-1),(1,0),(0,1)]
while k:
    #黑格:上 右 下 左
    #白格:上 左 下 右
    #黑格
    if board[x][y]==1:
        board[x][y]=0
        #确定接下来的要移动到的位置以及方向
        index=(dic_b[s]+1)%4
        step=step_b[index]
        s=dir_b[index]
        x+=step[0]
        y+=step[1]
    #白格
    elif board[x][y]==0:
        board[x][y]=1
        #确定接下来的要移动到的位置以及方向
        index=(dic_w[s]+1)%4
        step=step_w[index]
        s=dir_w[index]
        x+=step[0]
        y+=step[1]
    k=k-1
print(x,y)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

so.far_away

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值