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。