步伐员的算法趣题Q14: 国名接龙

程序 程序 1618 人阅读 | 0 人回复

<
目次

1. 标题问题描摹
2. 解题阐发--深度劣先搜刮
3. 代码
3.1 运转结果
4. 跋文

1. 标题问题描摹

        FIFA全国杯对足球喜好者而行是四年一次的衰事。上面我们拿2014年全国杯参赛国的国名做个词语接龙游戏。不过,那里用的没有是中文,而是英笔墨母(疏忽大小写)。2014年FIFA全国杯的32个参赛国拜见代码中的国名列表。
        举个例子,假如像上面如许,那末持续 3 个国名以后接龙便完毕了(由于以上国名列表中出有英文称号以 D 开首的国度)。
                 “Japan” →“Netherlands” →“Switzerland”
        标题问题:假定每一个国名只能利用一次,供能连得最少的挨次,和响应的国名个数。
2. 解题阐发--深度劣先搜刮

        本题能够用深度劣先搜刮算法去处理。
        针对某个国度开端的状况,以深度搜刮的方法搜刮每条可止的接龙途径。根据每条接龙途径不断搜刮到底(曲到当前接龙途径的最初一个国度再也找没有到下一个能够接上的国度了)。此时将当前接龙的少度取保留的最年夜少度的接龙(正在完成中能够做为齐局变量)停止比较并按照比较结果响应更新。
        沿每条途径深度搜刮时,用visitedunvisited别离办理曾经搜刮过的国度和尚已搜刮过的国度。进一步的exploration仅从unvisited当选与下一个探究工具,因而免却了“能否已被会见过”的查抄判定,另外一圆里,visited是根据会见挨次存进被会见工具,以是此中存储的便是当前搜刮的接龙挨次。visitedunvisited皆需求以栈的方法停止办理,因而假如用递回挪用的方法完成的话,将它们做为递回函数的接心参数传递便可;假如用轮回方法完成的话,则需求留意隐式的进栈战出栈办理。
        留意:本题是请求接龙中统一国名只能利用一次,那意味着途径不克不及构成loop。正由于那个,才能够以上述的visitedunvisited的方法停止朋分以完成节面(每一个国名便是一个节面)没有反复会见的办理。正在有些标题问题中,许可节面正在途径上反复呈现,可是没有许可edge反复,则需求别的的避免反复会见的办理机造。
        此外,最少接龙搜刮的结果依靠于从哪一个国度开端,因而需求正在针对以某个国度为出发点的深度劣先搜刮的根底上再逃减一层中层轮回,遍历国度名字列表中的每个国度做为肇端国度别离停止接龙搜刮。
3. 代码

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Sep  6 08:17:34 2021
  4. @author: chenxy
  5. """
  6. import sys
  7. import time
  8. import datetime
  9. import math
  10. # import random
  11. from   typing import List
  12. # from   queue import Queue
  13. # from   collections import deque
  14. # import itertools as it
  15. country_list = ["Brazil", "Croatia", "Mexico",
  16.                 "Cameroon", "Spain", "Netherlands",
  17.                 "Chile", "Australia", "Colombia",
  18.                 "Greece", "Cote d&#39;Ivoire", "Japan",
  19.                 "Uruguay", "Costa Rica", "England",
  20.                 "Italy", "Switzerland", "Ecuador",
  21.                 "France", "Honduras", "Argentina",
  22.                 "Bosnia and Herzegovina", "Iran", "Nigeria",
  23.                 "Germany", "Portugal", "Ghana",
  24.                 "USA", "Belgium", "Algeria",
  25.                 "Russia", "Korea Republic" ]
  26. longest_jielong = []
  27. def jielong_explore(visited, unvisited):
  28.     """
  29.     Parameters
  30.     ----------
  31.     visited   : list of conuntry names already visited
  32.     unvisited : list of conuntry names not yet visited        
  33.     Returns   : None
  34.     """
  35.    
  36.     isNxtFound = False
  37.     if len(unvisited) != 0: # There are countries not yet visited, continue the exploration.
  38.         for index, c in enumerate(unvisited):
  39.             if c[0] == visited[-1][-1]:
  40.                 jielong_explore(visited + [c], unvisited[:index] + unvisited[index + 1:])
  41.                 # jielong_explore(visited.append(c), unvisited[:index] + unvisited[index + 1:])
  42.                 isNxtFound = True
  43.                
  44.     # If there is no next country found, then the current jielong path is finished,
  45.     # Compare the length of the current jielong with the recorded longgest jielong and update accordingly.
  46.     if not isNxtFound or len(unvisited) == 0:
  47.         global longest_jielong
  48.         if len(longest_jielong) < len(visited):
  49.             longest_jielong = visited
  50.    
  51. # Convert all country names to upper case for the convenience of processing.
  52. for k in range(len(country_list)):
  53.     country_list[k] = country_list[k].upper()
  54. # Start from each country for a new jielong game
  55. tStart = time.time()
  56. for i, country in enumerate(country_list):
  57.     jielong_explore([country], country_list[:i]+country_list[i+1:])
  58. tCost  = time.time() - tStart
  59. print("The max length of JieLong = {0}\n{1}\ntCost={2:6.3f}(sec)".format(len(longest_jielong), longest_jielong,tCost))
复造代码
3.1 运转结果

        The max length of JieLong = 8
        [&#39;KOREA REPUBLIC&#39;, &#39;CAMEROON&#39;, &#39;NETHERLANDS&#39;, &#39;SPAIN&#39;, &#39;NIGERIA&#39;, &#39;AUSTRALIA&#39;, &#39;ARGENTINA&#39;, &#39;ALGERIA&#39;]
        tCost= 0.002(sec)

4. 跋文

        最少接龙标题问题,能够遥想到最少途径搜刮标题问题,因而能够念到该当也能够用广度劣先搜刮(BFS)的方法去完成。可是BFS当然可以找出最少途径,由于没有是沿着途径停止搜刮,以是不克不及像DFS那样天然天记载搜刮途径,正在找到最少途径后,怎样规复出去对应的途径是一个标题问题。值得持续考虑。

        上一篇:Q13: 满意字母算式的解法
        下一篇:Q15: 走楼梯
        本系列总目次拜见:程序员的算法趣题:具体阐发战Python齐解
        

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请发帖留言提供原创证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则