python问题,跪求大神解答

书上的一个题,我知道答案,但是怎么用python写出来啊?求大神帮助对乒乓球选手参加双打比赛,他们的球衣号码是1,2,…18.这时裁判惊喜地发现,每对选手的球衣号码之和都... 书上的一个题,我知道答案,但是怎么用python写出来啊?求大神帮助
对乒乓球选手参加双打比赛,他们的球衣号码是1,2,…18.这时裁判惊喜地发现,每对选手的球衣号码之和都恰好是一个完全平方数,则求1号选手结对的是几号选手
展开
 我来答
百度网友e208b91
2015-12-02 · 超过13用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:19.6万
展开全部
#!/usr/bin/python
#encoding=utf-8
import sys

def get_candidates(n):
    ''' 返回小于n的所有完全平方数 '''
    ret = set()
    i = 2
    while (i*i <= n):
        ret.add(i*i)
        i += 1
    return ret

_table = []
def bt(paired_numbers, player_numbers, candidates):
    global _table
    for s in _table:
        if player_numbers == s:
            return
    _table.append(player_numbers)
    if len(paired_numbers) == 9:
        print "find solution"
        print paired_numbers
        sys.exit(0)
    for p1 in player_numbers:
        for p2 in player_numbers:
            if p1 >= p2:
                continue
            if (p1+p2) in candidates:
                new_player_numbers = player_numbers.copy()
                new_paired_numbers = paired_numbers.copy()
                new_player_numbers.remove(p1)
                new_player_numbers.remove(p2)
                new_paired_numbers.add((p1, p2))
                bt(new_paired_numbers, new_player_numbers, candidates)



if __name__ == "__main__":
    player_numbers = set()
    for n in range(1,19):
        player_numbers.add(n)
    # 获取最大可能的号码和
    candidates = get_candidates(18+17)
    bt(set(), player_numbers, candidates)

代码都写出来了,不至于看不懂吧,最后结果为
set([(3, 13), (6, 10), (7, 18), (1, 15), (9, 16), (4, 12), (8, 17), (5, 11), (2, 14)])

也就是说,1的对手是15

追问
大神,我可以问下这题的思路吗,我才学,有许多地方看不懂·········
追答
这属于一到算法题目,和语言本身无关,相关资料去查阅回溯算法,也就是所说的backtracking,核心思路就是bt那个函数,它从候选人中选取两个出来,看这两个p1+p2是否为一个完全平方数,如果是,就将这两个候选人数据加入到paired_numbers中,然后递归剩下的players。相当于一种计算机的暴力算法,执行可能的所有步骤,最终总会找到答案。去看算法书吧,比我这里讲的详细多了。
t59616
2015-12-02 · TA获得超过784个赞
知道小有建树答主
回答量:319
采纳率:50%
帮助的人:350万
展开全部
from random import shuffle
ls = []#存储完全平方数
for i in range(10):
    if i*i <=18+17 and i*i >= 1+2:#完全平方数取值范围
        ls.append(i*i)
print '完全平方数: ' + str(ls)

players = []#存储选手号码
for i in range(1,19):
    players.append(i)
print '参赛选手: ' + str(players)

def jiance(l):
    c=0
    shuffle(l)
    for i in range(0,18,2):#九组组合
        if l[i] + l[i+1] in ls:
            c += 1
    if c == 9:
        print '可能的结果: ' + str(l)

if __name__ == '__main__':
    while 1:
        jiance(players)

基本思路就是总共有九组对手,我们假设一号位置和二号位置对打,三号位置和四号位置对打,以此类推,借用random函数,随机产生可能的排列组合情况,总有一组情况会满足题目要求,这种方法的弊端就是随机产生的排列效率低下。下面是一个结果,1号和15号对打。

完全平方数: [4, 9, 16, 25]
参赛选手: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
可能的结果: [17, 8, 2, 14, 6, 10, 5, 11, 16, 9, 12, 4, 7, 18, 13, 3, 1, 15]
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式