You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写方法根据地图开放规则查询指定日期的开放地图?

地图开放规则与查询实现方案

地图基础数据

地图名称开放起始日持续天数
mapA83
mapB113
mapC153
mapD353

具体开放节点

  • 第1天为服务器开服日
  • 第8天:mapA开放
  • 第11天:mapB开放
  • 第14天:mapC开放
  • 第35天:mapD开放

地图切换规则

  1. 地图开放后持续指定天数,到期次日0点自动关闭
  2. 当前地图关闭时,按规则切换下一张地图:
    • 优先检查按开放顺序的下一张地图是否已到开放起始日(即下一张地图的开放日 ≤ 关闭当天)
    • 若已开放,直接切换至该地图
    • 若未开放,则从所有已开放的地图中从头开始循环

运行示例

  • 第1至7天:无可用地图,不开放任何地图
  • 第8天:mapA开放,持续3天(8-10日)
  • 第11天:关闭mapA,下一张mapB已开放,故开放mapB(11-13日)
  • 第14天:关闭mapB,下一张mapC未开放,故从已开放地图从头开始,开放mapA(14-16日)
  • 第17天:关闭mapA,开放mapB(17-19日);第20天:关闭mapB,此时mapC已开放,故开放mapC(20-22日)

问题需求

实现一个查询方法,输入任意日期即可返回当日开放的地图,核心难点是处理地图循环切换的逻辑。


编码思路

核心逻辑拆解

  1. 数据预处理:将地图按开放起始日从小到大排序,确保顺序正确
  2. 边界判断:输入日期早于第一张地图开放日时,直接返回无可用地图
  3. 分段跳跃计算:无需逐天模拟,通过关键节点跳跃定位:
    • 先定位到目标日期所在的初始地图周期
    • 若遇到新地图开放节点,直接切换;若未遇到,则计算已开放地图的循环周期,通过取余快速定位目标地图

伪代码实现

// 定义地图数组(按开放日排序)
maps = [
  {name: "mapA", available_time:8, last_time:3},
  {name: "mapB", available_time:11, last_time:3},
  {name: "mapC", available_time:15, last_time:3},
  {name: "mapD", available_time:35, last_time:3}
]

function getCurrentMap(day):
  // 边界情况:无可用地图
  if day < maps[0].available_time:
    return "无可用地图"
  
  current_idx = 0
  // 计算当前地图的结束日(包含当天)
  current_end = maps[current_idx].available_time + maps[current_idx].last_time - 1
  
  // 目标日期在当前地图有效期内
  if day <= current_end:
    return maps[current_idx].name
  
  while True:
    next_idx = (current_idx + 1) % len(maps)
    close_day = current_end + 1  // 当前地图关闭的日期(次日0点)
    
    // 检查下一张地图是否已开放
    if maps[next_idx].available_time <= close_day:
      // 切换到下一张地图
      current_idx = next_idx
      current_end = close_day + maps[current_idx].last_time - 1
      
      if day <= current_end:
        return maps[current_idx].name
    else:
      // 筛选所有已开放的地图
      active_maps = [m for m in maps if m.available_time <= close_day]
      cycle_total = sum(m.last_time for m in active_maps)
      days_remaining = day - close_day
      
      // 计算循环内的偏移,定位目标地图
      offset = days_remaining % cycle_total
      accumulated = 0
      for map in active_maps:
        accumulated += map.last_time
        if offset < accumulated:
          return map.name

Python代码实现

from dataclasses import dataclass
from typing import Optional

@dataclass
class MapInfo:
    name: str
    available_time: int
    last_time: int

# 初始化地图数据(按开放起始日排序)
MAPS = [
    MapInfo("mapA", 8, 3),
    MapInfo("mapB", 11, 3),
    MapInfo("mapC", 15, 3),
    MapInfo("mapD", 35, 3),
]

def get_current_map(day: int) -> Optional[str]:
    # 处理无可用地图的情况
    if day < MAPS[0].available_time:
        return None
    
    current_idx = 0
    # 计算当前地图的结束日期(包含当天)
    current_end = MAPS[current_idx].available_time + MAPS[current_idx].last_time - 1
    
    if day <= current_end:
        return MAPS[current_idx].name
    
    while True:
        next_idx = (current_idx + 1) % len(MAPS)
        close_day = current_end + 1  # 当前地图关闭的日期(次日0点)
        
        # 检查下一张地图是否已开放
        if MAPS[next_idx].available_time <= close_day:
            current_idx = next_idx
            current_end = close_day + MAPS[current_idx].last_time - 1
            
            if day <= current_end:
                return MAPS[current_idx].name
        else:
            # 筛选所有已开放的地图
            active_maps = [m for m in MAPS if m.available_time <= close_day]
            cycle_total = sum(m.last_time for m in active_maps)
            days_remaining = day - close_day
            
            # 计算循环内的偏移,定位目标地图
            offset = days_remaining % cycle_total
            accumulated = 0
            for map in active_maps:
                accumulated += map.last_time
                if offset < accumulated:
                    return map.name

测试验证

  • get_current_map(14) → 返回 mapA(符合示例)
  • get_current_map(17) → 返回 mapB
  • get_current_map(20) → 返回 mapC
  • get_current_map(35) → 返回 mapD
  • get_current_map(38) → 返回 mapA

内容的提问来源于stack exchange,提问作者Criwran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:59:52