蓝桥杯python练习——穿越时空之门

目录

穿越时空之门 

问题描述

解析

题解


穿越时空之门 

问题描述

随着 20242024 年的钟声回荡,传说中的时空之门再次敞开。这扇门是一条神秘的通道,它连接着二进制和四进制两个不同的数码领域,等待着勇者们的探索。

在二进制的领域里,勇者的力量被转换成了力量数值的二进制表示中各数位之和。

在四进制的领域里,力量的转换规则相似,变成了力量数值的四进制表示中各数位之和。

穿越这扇时空之门的条件是严苛的:当且仅当勇者在二进制领域的力量等同于四进制领域的力量时,他才能够成功地穿越。

国王选定了小蓝作为领路人,带领着力量值从 11 到 20242024 的勇者们踏上了这段探索未知的旅程。作为小蓝的助手,你的任务是帮助小蓝计算出,在这 20242024 位勇者中,有多少人符合穿越时空之门的条件。

解析

我们可以联想一下在计算机组成原理或者是c语言课程里面讲过的进制转化,题目给我们一个十进制,如果要转化为二进制,可以不断除以二,有余数则写1,没有就写0,最后得到二进制结果

如图,同理,转化为4进制也是如此

对于5来说,二进制为101,各位数之和怎么求呢

可以先让5%2,结果为1,然后5//2后变为2,2%2结果为0,然后2//2结果为1,1%2结果为1

最后将三个结果相加得到2

对于4进制来说也是同理,将%和//变为16即可,由此得到解题思路

题解

import os
import sys

# 请在此输入您的代码
#二进制的各位数之和要与四进制各位数之和相等就能穿越时空之门
#对于5来说,二进制为101,各位数之和怎么求呢
#可以先让5%2,结果为1,然后5//2后变为2,2%2结果为0,然后2//2结果为1,1%2结果为1
#最后将三个结果相加得到2
#对于4进制来说也是同理,将%和//变为16即可

def check(n2):
  n4 = n2
  n2sum = 0
  n4sum = 0
  #计算二进制各位数之和
  while n2:
    n2sum = n2sum + n2 % 2
    n2 = n2 // 2
  #计算四进制各位数之和
  while n4:
    n4sum = n4sum + n4 % 4
    n4 = n4 // 4
  #判断
  if n2sum == n4sum:
    return 1
  else:
    return 0

sum = 0
for i in range(1, 2025):
  if check(i):
    sum += 1
print(sum)

 最后答案为63

### 蓝桥杯 Python 竞赛 '穿越时空之门' 题目解析 #### 题目描述 在一个秘的世界里存在多个时空之门,这些时空之门可以将旅行者瞬间传送到另一个位置。给定一系列的时空之门坐标以及起点和终点的位置,求从起点到终点最短路径所经过的时空之门数目。 输入格式如下: - 第一行两个整数 n 和 m (0 ≤ n, m ≤ 1e5),表示有n个传送门,m条双向道路连接着不同的地点; - 接下来n行每行四个整数 xi yi ti wi 表示第i个传送门位于(xi,yi), 使用该传送门消耗时间ti并获得wi点能量值; - 再接下来m行每行三个整数 ui vi di 描述一条无向边(ui,vi)长度为di; - 最后一行给出起始点sx sy和目标点ex ey 的坐标[^1]。 #### 解决方案概述 此问题可以通过构建图结构来解决,并利用广度优先搜索算法(BFS)找到最短路径。对于每一个节点(即位置),如果当前所在之处恰好有一个可用的传送门,则可以选择通过它前往其他地方;也可以沿着普通路线前进至相邻结点继续探索直到抵达目的地为止。 ```python from collections import deque, defaultdict def bfs(start_x, start_y, end_x, end_y, portals, edges): graph = defaultdict(list) # 构建图模型 for u, v, d in edges: graph[u].append((v, d)) graph[v].append((u, d)) queue = deque([(start_x, start_y, 0)]) visited = set() while queue: cx, cy, steps = queue.popleft() if (cx, cy) == (end_x, end_y): return steps if (cx, cy) not in visited: visited.add((cx, cy)) # 尝试使用传送门 for px, py, _, _ in portals: if abs(cx - px) + abs(cy - py) <= 1: queue.append((px, py, steps + 1)) # 或沿路前行 for nx, nd in graph[(cx, cy)]: queue.append((nx[0], nx[1], steps)) return -1 ``` 上述代码实现了基于BFS的方法来找寻最少使用的传送门次数以到达终点。注意这里假设了所有的传送门都是立即可达的(即距离为1以内),实际应用中可能还需要考虑更多细节如传送门之间的具体移动方式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柏箱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值