很喜欢很喜欢今天的自己 虽然有超多的小朋友 但是感觉自己好像也回到小时候 一点不像大学生 好像才刚刚初中 坐了两次摩天轮真的很浪漫 玩海盗船的时候一个小弟弟喊我姐姐带他的弟弟一起玩 好喜欢这样的小朋友 检票的阿姨还问我几岁 我真的有恍惚一下 差点说十六岁 虽然海盗船不大 在最高点也会有自由落体的感觉 以前害怕的不敢睁开眼只听到我妹妹在一旁猛喊 我完全失声 今天好像在享受 享受自己的害怕和心脏被压迫的感觉 不懂 也许是闷太久了 和jl坐在对面 好好笑 坐之前超大胆的人反而在害怕 超后悔手机放外面了 不然肯定录下来哈哈哈哈哈 唯一伤心的事就是写在备忘录的拍立得还是忘拿了 记录每一刻生活 下次一定拿上 生活要没有烦恼 出发永远是最有意义的事情 明天永远会更更好
遍历排列的一个简洁的程序算法
以前遍历排列都是用数组,再用循环去加减里面的元素,还得排除重复的。程序比较麻烦,显得比较乱。
最近在搞拉丁方需要遍历排列,思考有不有什么比较优雅一点的算法可以直接得到所有需要的排列呢?
想到一个排列计数1-n!到排列的一个一一对应的简洁的程序算法,这样程序就比较优雅了。
n皇后问题的Python代码:
from math import *
def check(x,n):
for i in range(1,n):
for j in range(i):
if abs(x[i]-x[j]) == i-j:
return i
return 0
def queen(n):
allnum=factorial(n)
num=0
x=[0]*n
# for i in range(allnum):
i=0
while i< allnum:
xx=i
for j in range(n):
yy=factorial(n-1-j)
x[j]=int(xx/yy)
xx=xx%yy
y=list(range(n))
for j in range(n):
x[j]=y.pop(x[j])
j=check(x,n)
if j==0:
num+=1
i+=1
else:
i+=factorial(n-j-1)
print("\r\nn=%d num=%d"%(n,num))
queen(10)
n皇后问题的Julia代码:
#queen.jl
##
# Copyright by yuange 2023.5.30
function check(x,n)
for i in 2:n
for j in 1:i-1
if abs(x[i]-x[j])==(i-j) return i end
end
end
return 0
end
function queen(n)
x=zeros(Int,n)
allnum=factorial(BigInt(n))
num=0
i=0
while i xx=i
for j in 1:n
yy=factorial(BigInt(n-j))
x[j]=div(xx,yy)
xx=xx%yy
end
y=zeros(Int,n)
y[1:n]=1:n
for j in 1:n
x[j]=popat!(y,x[j]+1)
end
j=check(x,n)
if j==0
num+=1
i+=1
else
i+=factorial(BigInt(n-j))
end
end
print("\r\nn=$n,num=$num\r\n")
end
queen(10)
校验算法结果和以下结果没有问题
N皇后问题解的个数
n solution(n)
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10724
112680
1214200
1373712
14365596
152279184
1614772512
1795815104
18666090624
194968057848
2039029188884
21314666222712
222691008701644
2324233937684440
24227514171973736
252207893435808352
注意Python和Julia等语言for循环里不接受改变循环变量(还是我没找到方法?),可以用while等代替,这是和C语言系的一个比较大的差异。
for j in range(n):
yy=factorial(n-1-j)
x[j]=int(xx/yy)
xx=xx%yy
y=list(range(n))
for j in range(n):
x[j]=y.pop(x[j])
这段代码一重循环就把排列计数0到n!-1的排列计数xx转换成一个0到n-1的排列数组了。程序只要遍历xx就可以,这样程序一看就结构比较简单。
一般这样的问题,代码要不用递归调用要不就用动态的循环管理。递归调用程序结构简单一些,但是递归调用开销大,其实递归调用本质还是等于多重循环。动态循环管理开销小,但是程序写起来有点乱,程序结构不太好。
这个算法直接排列计数和排列一一对应,程序结构就很简洁。唯一不是太好的地方就是后面的转换如果用数组pop操作代码是简洁,但是这种操作是相对比较耗费时间的。这个后面的用数组pop转换看怎么改用自己的比较简洁的代码。
还好如果不是过分需要效率的时候,这算法就算用数组的pop也还算能接受。
因为大量排列是不符合的,可以x[j]第二项生成就开始就检测,这样会减少很多时间。
这文章主要关注点不是在这里。
以前遍历排列都是用数组,再用循环去加减里面的元素,还得排除重复的。程序比较麻烦,显得比较乱。
最近在搞拉丁方需要遍历排列,思考有不有什么比较优雅一点的算法可以直接得到所有需要的排列呢?
想到一个排列计数1-n!到排列的一个一一对应的简洁的程序算法,这样程序就比较优雅了。
n皇后问题的Python代码:
from math import *
def check(x,n):
for i in range(1,n):
for j in range(i):
if abs(x[i]-x[j]) == i-j:
return i
return 0
def queen(n):
allnum=factorial(n)
num=0
x=[0]*n
# for i in range(allnum):
i=0
while i< allnum:
xx=i
for j in range(n):
yy=factorial(n-1-j)
x[j]=int(xx/yy)
xx=xx%yy
y=list(range(n))
for j in range(n):
x[j]=y.pop(x[j])
j=check(x,n)
if j==0:
num+=1
i+=1
else:
i+=factorial(n-j-1)
print("\r\nn=%d num=%d"%(n,num))
queen(10)
n皇后问题的Julia代码:
#queen.jl
##
# Copyright by yuange 2023.5.30
function check(x,n)
for i in 2:n
for j in 1:i-1
if abs(x[i]-x[j])==(i-j) return i end
end
end
return 0
end
function queen(n)
x=zeros(Int,n)
allnum=factorial(BigInt(n))
num=0
i=0
while i
for j in 1:n
yy=factorial(BigInt(n-j))
x[j]=div(xx,yy)
xx=xx%yy
end
y=zeros(Int,n)
y[1:n]=1:n
for j in 1:n
x[j]=popat!(y,x[j]+1)
end
j=check(x,n)
if j==0
num+=1
i+=1
else
i+=factorial(BigInt(n-j))
end
end
print("\r\nn=$n,num=$num\r\n")
end
queen(10)
校验算法结果和以下结果没有问题
N皇后问题解的个数
n solution(n)
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10724
112680
1214200
1373712
14365596
152279184
1614772512
1795815104
18666090624
194968057848
2039029188884
21314666222712
222691008701644
2324233937684440
24227514171973736
252207893435808352
注意Python和Julia等语言for循环里不接受改变循环变量(还是我没找到方法?),可以用while等代替,这是和C语言系的一个比较大的差异。
for j in range(n):
yy=factorial(n-1-j)
x[j]=int(xx/yy)
xx=xx%yy
y=list(range(n))
for j in range(n):
x[j]=y.pop(x[j])
这段代码一重循环就把排列计数0到n!-1的排列计数xx转换成一个0到n-1的排列数组了。程序只要遍历xx就可以,这样程序一看就结构比较简单。
一般这样的问题,代码要不用递归调用要不就用动态的循环管理。递归调用程序结构简单一些,但是递归调用开销大,其实递归调用本质还是等于多重循环。动态循环管理开销小,但是程序写起来有点乱,程序结构不太好。
这个算法直接排列计数和排列一一对应,程序结构就很简洁。唯一不是太好的地方就是后面的转换如果用数组pop操作代码是简洁,但是这种操作是相对比较耗费时间的。这个后面的用数组pop转换看怎么改用自己的比较简洁的代码。
还好如果不是过分需要效率的时候,这算法就算用数组的pop也还算能接受。
因为大量排列是不符合的,可以x[j]第二项生成就开始就检测,这样会减少很多时间。
这文章主要关注点不是在这里。
BGYO 是一个由五人组成的菲律宾男孩团体,于 2018 年由 ABS-CBN Star Hunt Academy 组建,并于 2021 年在 ABS-CBN 的 Star Magic 下亮相。它的成员包括 Gelo、Mikki、Nate、JL 和 Akira。他们的首张歌曲叫做“The Light”
你可以在这里观看:
https://t.cn/A6txybf4
#金泰亨kpop永一##kpop[超话]##kpop##kpop出圈名场面##朴智旻kpop唯一双顶奢男大使##遇见bts遇见更好的自己##bts防弹少年团##bts_dynamite#
你可以在这里观看:
https://t.cn/A6txybf4
#金泰亨kpop永一##kpop[超话]##kpop##kpop出圈名场面##朴智旻kpop唯一双顶奢男大使##遇见bts遇见更好的自己##bts防弹少年团##bts_dynamite#
✋热门推荐