题目
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 4 个正整数的平方和。
如果把 0 包括进去,就正好可以表示为 4 个数的平方和。
比如:
5=0^2+0^2+1^2+2^2;
7=1^2+1^2+1^2+2^2;
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 4 个数排序:
0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。
思路
还以为有什么数学定理,去看题解发现都是暴力遍历的,注意一下每个数的遍历范围。
这里只需要返回最小的表示法,如果之间print()会将所有的可能都输出,因此使用函数调用的方法来保证只输出第一种表示。
代码
import os
import sys
# 请在此输入您的代码
def find_nums(temp):
for i in range(temp+1): #i的范围为[0, N**0.5]
bm = int((N-i*i)**0.5)
for j in range(i, bm+1): #遍历[i, bm]的范围 找到第二个数
cm = int((N-i*i-j*j)**0.5)
for x in range(j, cm+1): #遍历[j, cm] 找第三个数
dm = int((N-i*i-j*j-x*x)**0.5)
if dm >= x and dm*dm + i*i + j*j + x*x == N: #计算第四个数 当前数要>=之前的数 并且平方和=N
print(i,j,x,dm)
return #print表示找到了一个组合 在这里return就不会继续找下一个组合了 不使用函数会将所有可能都print出来
N = int(input())
temp = int(N**0.5)
find_nums(temp)
题目
小蓝有一条玩具蛇,一共有16 节,上面标着数字 1至16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90度角。
小蓝还有一个4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母A 到P 共16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去
思路
有点像走迷宫,就想到之前的DFS,有点不太知道怎么写,看了一下别人的。主要思想就是以每个方格为起点去进行dfs遍历,方法+1的条件就是当前格子已经遍历完。注意递归后的撤销操作。
代码
import os
import sys
# 请在此输入您的代码
kind = 0
def dfs(x, y, count):
global kind
if count == 16:
kind += 1
return True
for offset in offsets: #四个方向进行遍历
xx =x + offset[0]
yy =y + offset[1]
if 0 <= xx < 4 and 0 <= yy < 4 and point[xx][yy] == 0: #合法性判断
point[xx][yy] = 1
dfs(xx, yy, count+1):
point[xx][yy] = 0 # 撤销
point[x][y] = 0 #撤销操作
return kind
point = [[0 for i in range(4)] for i in range(4)]
offsets = [[0,1], [0,-1], [1,0], [-1,0]]
for i in range(4):
for j in range(4):
point[i][j] = 1 #标记该点
dfs(i,j,1)
print(kind)
写到dfs,就去把之前的一个题目再写了一遍