当前位置:首页 » 《随便一记》 » 正文

程序员的算法趣题Q34: 会有几次命中注定的相遇_chenxy_bwave的专栏

17 人参与  2021年12月20日 18:14  分类 : 《随便一记》  评论

点击全文阅读


目录

1. 问题描述

2. 解题分析

3. 代码及测试

4. 后记


1. 问题描述

        假设存在如下图的正方形,该正方形被划分成了边长为1的正方形的格。男生从AB,女生从BA,分别沿着最短路径以相同速度前行(两人同步,每次都横向或纵向各走一格)。如果符合以下情形,则判定为“命中注定的相遇”

  1. 两次同时停在同一直线内的定点上(相互可见状态)
  2. 在同一顶点交汇(相互接触状态)

        边长为3时,几种成功和失败的例子如上图所示。

        问题:边长为6时,发生“命中注定的相遇”的情况共有多少种?

2. 解题分析

        两人都是以最短距离行进,因此男生只有{向右,向下}两种选项,女生只有{向左,向上}两种选项,两人的组合动作因此就是四种:

        (1) {男:右;女:左};

        (2) {男:下;女:左};

        (3) {男:右;女:上};

        (4) {男:下;女:上};

        每前进一步,进行是否符合条件的判断,如果是符合条件(a) ,则直接判断成功;如果是符号条件(b),将相互可见次数加1,如果相互可见次数到达2则判定成功;如果女生已经跑到男生的左上位置而还尚未满足条件的话,则可以判定失败;最后(作为边界条件),如果发生越界的话也判定失败。

        这种类型的问题很适合于用递归的方式实现(唯一需要担心的是递归深度),算法流程如下所示:

 

3. 代码及测试

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 19 08:24:18 2021

@author: chenxy
"""
import sys
import time
import datetime
import math
import random
from   typing import List
# from   queue import Queue
from   collections import deque
import itertools as it
from   math import sqrt, floor, ceil
import numpy as np

N = 6
M = 6
total_count = 0

def f(manX, manY, womanX, womanY, meet):
    # print(manX, manY, womanX, womanY, meet)
    global total_count

    if manX > N or manY > M or womanX < 0 or womanY < 0:
        return # Cross the boundary
    if manX > womanX and manY > womanY:
        return # Missed forever
    
    if manX == womanX and manY == womanY:
        total_count += 1
        # print(total_count)
        return
    if manX == womanX or manY == womanY:
        meet += 1
        if meet == 2:
            total_count += 1
            # print(total_count)
            return
        
    # Four possible move combination of two people
    f(manX+1, manY, womanX-1, womanY, meet)
    f(manX+1, manY, womanX, womanY-1, meet)
    f(manX, manY+1, womanX-1, womanY, meet)
    f(manX, manY+1, womanX, womanY-1, meet)

    # return -- No need, Should not come to this point.

tStart  = time.perf_counter()
f(0, 0, N, M, 0)
tCost  = time.perf_counter() - tStart

print('total_count = {0}, tCost = {1:6.3f}(sec)'.format(total_count,tCost))  

        运行结果:total_count = 15752, tCost =  0.026(sec)

4. 后记

        这道题目算是最近几道问题感觉最为轻松的,难得地很快就想清楚了解决方案。

        然而,令人尴尬的是,答案错了。更令人尴尬的是,“偷看”了原书答案以及CSDN上其他小伙伴们贴出来的答案,基本思路是一致的,运行别人的代码也的确给出了正确答案,可是反复对比看仍然没有看出自己的代码究竟错在哪儿了—自信心受到了一万点暴击

        但是,与“看到一个正确的答案后:喔,原来如此”相比,也许看一个错误的答案并揪出其中的八阿哥(BUG)更具有挑战性,也更有助益。所以,这里还是厚着脸皮贴出来供大家批判,并期待有人帮助我指出哪儿错了^-^.

       

        上一篇:Q33: 飞车与角行的棋步

        下一篇:       

         本系列总目录参见:程序员的算法趣题:详细分析和Python全解


点击全文阅读


本文链接:http://zhangshiyu.com/post/31808.html

的是  两人  递归  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 高温末世,男友的学姐竟想用大脑换船票(王薇江哲薇薇)全书浏览_高温末世,男友的学姐竟想用大脑换船票全书浏览
  • 此日独听雨后荷(谷禾谢瓷乔越)全书浏览_此日独听雨后荷全书浏览
  • 陌路归心(宋思棠沈言洛)
  • 完结文我在恐怖游戏开裁缝铺列表_完结文我在恐怖游戏开裁缝铺(林慕秋)
  • 全书免费谢清禾姜博诚_谢清禾姜博诚全书免费
  • 离婚后我收获真爱,前妻却快死了(秦落音陆轩),离婚后我收获真爱,前妻却快死了
  • 老公把上亿豪宅送养妹后,我把人和房都拆了(顾思思顾言洲)全书免费_(顾思思顾言洲)老公把上亿豪宅送养妹后,我把人和房都拆了后续(顾思思顾言洲)
  • 沈星悦傅时安_沈星悦傅时安
  • 离婚后,居然还能以旧换新?(陈汉李淼淼李思)全书浏览_离婚后,居然还能以旧换新?全书浏览
  • 完结文给女团主播狂刷百万反被骂穷逼,我反手送她队友出道列表_完结文给女团主播狂刷百万反被骂穷逼,我反手送她队友出道(秦薇)
  • 全书浏览老公将我第十个孩子送给情人后,我果断改嫁他绝嗣干爹(苏云遮盛炽)_老公将我第十个孩子送给情人后,我果断改嫁他绝嗣干爹(苏云遮盛炽)全书结局
  • 全文无边怨恨是她活下来的最大动力(江寒静顾榕赫)列表_全文无边怨恨是她活下来的最大动力

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1