5kyu Square sums (simple)

5kyu Square sums (simple)

题目背景:

Task

Write function square_sums_row (or squareSumsRow/SquareSumsRow depending on language rules) that, given integer number N (in range 2…43), returns array of integers 1…N arranged in a way, so sum of each 2 consecutive numbers is a square.

Example
For N=15 solution could look like this:
[ 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8 ]

题目分析:

本道题题面的意思很容易领会,就是将1-N的数按照一定顺序排列后,使得相邻的两个数两两相加为一个平方数。但是题目的下手点比较棘手,最简单的思路就是DFS,从第一个数设置为 1 - N中的任意一个,之后不断深搜遍历,直至找到最终的解法,这种思路比较朴素,不过对我个人而言,我个人不是很擅长写DFS代码,也可能是写得比较少orz。不过本道题如果采用DFS算法,因为数据量较少,直接深搜也可以AC。先附上DFS的AC代码,之后会讨论下另一种解法的思路。

AC代码:

import numpy
success = False
ans = [0 for i in range(44)]
hash1 = [False for i in range(44)]

def judge(num1, num2):
	if numpy.square(numpy.floor(numpy.sqrt(num1 + num2))) == num1 + num2: return True
	else: return False

def Dfs(num, cnt):
	global success
	if(num > 1):
		if(judge(ans[num], ans[num-1]) == False): return

	if(num == cnt): 
		success = True
		return 

	for i in range(2, cnt + 1):
		if not hash1[i]:
			ans[num + 1] = i
			hash1[i] = True
			Dfs(num + 1, cnt)
			if success: return
			hash1[i] = False
            
def square_sums_row(n):
    global success
    for i in range(1, n + 1):
        for j in range(1, n + 1): hash1[j] = False
        ans[1] = i
        hash1[i] = True
        success = False
        Dfs(1, n)
        if success: return ans[1: n + 1]
        
    return False

第二种思路:
这是我在草稿上演练时想到的思路,感觉是一个更优的思路的一部分,不过因为自己没有理清楚代码如何编写,就只好说下思路了。大致的想法是,对于1 - N的每个数当做图中的一个节点,然后每个节点去找和它之和为平方数的节点,节点之间如果和为平方数那么添加一条连线,最后就就相当于在整个图中找一条连线可以把所有的节点过一遍同时每个节点只经过一次,如果找到,那么存在一个排列满足题目要求,否则不存在返回false。

如图中所示,我们找到一个连线可以将所有节点过一遍同时只经过每个节点一遍:9 -> 7 -> 2 -> 14 -> 11 -> 5 -> 4 -> 12 -> 13 -> 3 -> 6 -> 10 -> 15 -> 1 -> 8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值