蓝桥杯真题训练
1-等差数列
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N个整数。
现在给出这 N个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入描述
输入的第一行包含一个整数 N。
第二行包含 N个整数 并不一定是按等差数列中的顺序给出)
a = int(input())
b = [int(a) for a in input().split(" ")]
c = sorted(b)
d = []
for f in range(1,len(c)):
d.append(c[f]-c[f-1])
sum = 0
if min(d)==0:
print(len(c))
else:
for m in range(min(b),max(b)+1,min(d)):
sum += 1
print(sum)
解题思路:这里引用了风起云涌的代码。这题很简单,既然求最短,就是在这个数组最大和最小之间求,然后比每个数字之间的差,最小的差,就是符合最短的等差数列,里面注意的是有等差为0的数组。
2-受伤的皇后
有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n个受伤的国际象棋皇后,要求:
任何两个皇后不在同一行。
任何两个皇后不在同一列。
如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
n=int(input())
map=[[0]*(n+2) for i in range(n+2)]
f=[0]*(n+2)
def dfs(m, l, map,f):
global count
if(l==n):
count+=1
return
for i in range(1, n+1):
if(abs(i-m)>1 and f[i]==0 and map[l][i-1]==0 and map[l][i+1]==0 and map[l+2][i-1]==0 and map[l+2][i+1]==0):
f[i]=1
map[l+1][i]=1
dfs(i, l+1, map, f)
f[i]=0
map[l+1][i]=0
count=0
for i in range(1, n+1):
f[i]=1
map[1][i]=1
dfs(i, 1,map,f)
map[1][i]=0
f[i]=0
print(count)
解题思路:这里引用了LOU3805123070的代码。思想还是用的是dfs,这题的关键是如何实现这种dfs。这里每个位置的复位都可以理解,我认为最关键的是abs(i-m)>1。if语句中的这句话,很巧妙地使斜对角的情况并且行相差3的情况放进去。还有作者在原本就开拓一圈的数组,使得首尾的情况一般化,非常巧妙。