四平方和&&玩具蛇

题目

四平方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多 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,就去把之前的一个题目再写了一遍

 小朋友崇拜圈&&修改数组_pepsi_w的博客-CSDN博客

你可能感兴趣的:(蓝桥杯——python,算法)