最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 关于棋盘的一个

    每周挑战 281

    很抱歉在过去的几周里我没能做到。我搬了家,换了新工作,所以这段时间没有机会参与挑战。

    穆罕默德·s·安瓦尔 (mohammad s. anwar) 每周都会发出“每周挑战”,让我们所有人都有机会为两周的任务提出解决方案。我的解决方案首先用python编写,然后转换为perl。这对我们所有人来说都是练习编码的好方法。

    挑战,我的解决方案

    任务 1:检查颜色

    任务

    给定坐标,一个字符串,代表棋盘正方形的坐标,如下所示:

    关于棋盘的一个

    编写一个脚本,如果方块是亮的则返回 true,如果方块是暗的则返回 false。

    我的解决方案

    这相对简单。我做的第一件事是检查提供的位置是否有效(第一个字符是 a-h,第二个字符在 1 到 8 之间)。

    然后我检查第一个字母是否是 a、c、e 或 g 并且数字是偶数,或者第一个字母是 b、d、f 或 h 并且数字是奇数,返回 true。否则返回 false。

    def check_color(coords: str) -> bool:
        if not re.search('^[a-h][1-8]$', coords):
            raise valueerror('not a valid chess coordinate!')
    
        if coords[0] in ('a', 'c', 'e', 'g') and int(coords[1]) % 2 == 0:
            return true
        if coords[0] in ('b', 'd', 'f', 'h') and int(coords[1]) % 2 == 1:
            return true
        return false
    

    示例

    $ ./ch-1.py d3
    true
    
    $ ./ch-1.py g5
    false
    
    $ ./ch-1.py e6
    true
    

    任务2:骑士的行动

    任务

    国际象棋中的马可以从当前位置移动到两行或两列加一列或一行之外的任意方格。所以在下图中,如果它以s开头,它可以移动到任何标记为e的方块。

    关于棋盘的一个

    编写一个脚本,以起始位置和结束位置为基础,并计算所需的最少移动次数。

    我的解决方案

    这个更详细。我从以下变量开始:

    • deltas 是一个列表元组(perl 中的数组数组),其中包含骑士从当前位置移动的八种方式。
    • target 是我们想要到达的单元格。为此,我将第一个字母转换为从 1 到 8 的数字。它存储为元组,第一个值是列,第二个值是行。
    • moves 是移动的次数,从 1 开始。
    • see 是我们已经访问过的单元格列表。
    • coords 是骑士当前位置的列表。它从起始坐标开始。
    def knights_move(start_coord: str, end_coord: str) -> int:
        for coord in (start_coord, end_coord):
            if not re.search('^[a-h][1-8]$', coord):
                raise valueerror(
                    f'the position {coord} is not a valid chess coordinate!')
    
        deltas = ([2, 1], [2, -1], [-2, 1], [-2, -1],
                  [1, 2], [1, -2], [-1, 2], [-1, -2])
        coords = [convert_coord_to_list(start_coord)]
        target = convert_coord_to_list(end_coord)
        moves = 1
        seen = []
    

    然后我有一个当前坐标列表和增量列表的双循环。设置一个变量 new_pos 代表骑士的新坐标。如果这导致了棋盘之外的位置或我们已经去过的坐标,我会跳过它。如果它落在目标上,我将返回移动值。

    循环结束后,我将坐标列表重置为通过迭代收集的坐标,并将移动值加一。这一直持续到我们到达目标坐标。

        while true:
            new_coords = []
    
            for coord in coords:
                for delta in deltas:
                    new_pos = (coord[0] + delta[0], coord[1] + delta[1])
    
                    if not 0 
    
    
    
    <h3>
      
      
      示例
    </h3>
    
    
    
    <pre class="brush:php;toolbar:false">$ ./ch-2.py g2 a8
    4
    
    $ ./ch-2.py g2 h2
    3
    
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 关于棋盘的一个
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 291稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情