算法1-3 暴力枚举
知识点:排列和组合
排列:iteriools.permutations(iterable,r=None)
它会生成可迭代对象中所有可能的排列组合。如果指定了可选参数 r
,则会生成长度为 r
的排列组合;否则,会生成与输入可迭代对象相同长度的排列组合。
from itertools import *
s=['a','b','c']
a=permutations(s, 2)
for i in a:
print(i,end=" ")
####out:('a', 'b') ('a', 'c') ('b', 'a') ('b', 'c') ('c', 'a') ('c', 'b')
from itertools import *
s=['a','b','c']
a=permutations(s, 2)
for i in a:
j=i[0]+i[1]
print(j,end=" ")
#out:ab ac ba bc ca cb
组合
itertools.combinations
from itertools import *
s=['a','b','c']
a=combinations(s, 2)
for i in a:
j="".join(i)
print(j,end=" ")
#out:ab ac bc
最简单、直接、无技巧的手写排列代码(以 Python 代码为例)如下
s=[1,2,3,4]
for i in range(4):
for j in range(4):
if i!=j:
for k in range(4):
if k!=i and k!=j:
print("%d%d%d"%(s[i],s[j],s[k]),end=" ")
s=[1,2,3,4]
for i in range(4):
for j in range(i+1,4):
for k in range(j+1,4):
print("%d%d%d"%(s[i],s[j],s[k]),end=" ")
P8599 [蓝桥杯 2013 省 B] 带分数
from itertools import *
n = int(input())
bit = len(str(n)) # n 的位数
cnt = 0
for num in permutations("123456789"):
a, b, c = 0, 0, 0
for al in range(bit): # al 是 a 的位数,a 肯定比 n 短
a = int("".join(num[:al+1])) #一个 a
bLast = (n - a) * int(num[-1]) % 10 #b 的尾数,(n-a)c%10
if bLast == 0: continue #b 的尾数不可能等于 0,因为只用得到 1~9
bl = num.index(str(bLast)) #根据 b 的尾数确定 b 的长度
if bl <= al or bl >= 8: continue
b = int("".join(num[al+1:bl+1]))
c = int("".join(num[bl+1:]))
if b % c == 0 and n == a + b // c: cnt += 1
print(cnt)
P2089 烤鸡
写十个for循环暴力
" ".join(x)
是 Python 中的一种字符串操作,用于将列表 x
中的元素以空格为分隔符连接成一个字符串。具体来说,它会在每个相邻的元素之间插入一个空格,并返回一个新的字符串。
P2241 统计方形(数据加强版)
‘’’
正方形个数:
边长为1: nm
边长为2:(n-1)(m-1)
边长为3:(n-2)*(m-2)
矩形个数:正方形个数+长方形个数
(1+2+…n)*(1+2+…m)长方形个数 = 矩形个数 - 正方形个数 ‘’’
感觉在考数学
n,m=map(int,input().split(" "))
zhen,jv,chang=0,0,0
jv=(n*(n+1)/2)*(m*(m+1)/2)
a=min(n,m)
for i in range(1,a+1):
zhen += (n - i + 1) * (m - i + 1)
chang=int(jv-zhen)
print(zhen,chang)
P1618 三连击(升级版)
from itertools import *
A,B,C=map(int,input().split())
for cnm in permutations('123456789'):
a=int(''.join(cnm[:3]))
b=int(''.join(cnm[3:6]))
c=int(''.join(cnm[6:]))
if a/A==b/B and b/B==c/C:
print(a,b,c)
else:
print("No!!!")
break
###需要将比较条件改为绝对误差小于某个很小的数值,因为浮点数计算可能会存在误差。
from itertools import *
A,B,C=map(int,input().split())
t=0
for cnm in permutations('123456789'):
a=int(''.join(cnm[:3]))
b=int(''.join(cnm[3:6]))
c=int(''.join(cnm[6:]))
if a/A==b/B and b/B==c/C:
t+=1
print(a,b,c)
if t==0:
print("No!!!")
第一个问题在于只要有一个不满足就会输出No,然后结束运行
P1036 [NOIP2002 普及组] 选数
a=[1,2,3,4]如何实现b等于a中所有相加
怎么忘了sum函数了
from itertools import *
n, k = map(int, input().split(" "))
li = []
for i in range(n):
li += map(int, input().split())
p = 0
for num in combinations(li, k):
kk=sum(num)
p+=1
for i in range(2,kk):
if kk%i==0:
p-=1
break
print(p)
结果RE,不知道为什么
P1157 组合的输出
for num in combinations(a, r):
for i in range(r):
print(num[i], end=" ")
print() # 在每个组合输出完后换行
from itertools import combinations
n, r = map(int, input().split())
a = [i for i in range(1, n + 1)]
for num in combinations(a, r):
for i in range(r):
print("{:3}".format(num[i]), end=" ")
print()
解释print("{:3}".format(num[i]), end=" ")
-
{}
是一个格式化字符串的占位符,{:3}
表示将要被填充的内容占据 3 个字符的宽度,不足部分用空格填充。 -
format(num[i])
是指定了要填充到占位符中的内容,即列表中的第i
个元素。 -
end=" "
指定了在print()
函数输出内容后的结尾符号。在这里,将结尾符号设置为空格,这样输出的内容不会换行,而是继续在同一行输出。
举个例子,假设 num[i]
的值为 5,那么 "{:3}".format(num[i])
的结果就是 " 5"
,因为数字 5 会被填充到占据 3 个字符的宽度中,并且在左侧补充空格。
PS:开始没过的原因print("{:3}".format(num[i]), end=" ")
不应该有空格