level 2
Thomsoni
楼主
这是在微信公众号Wolfram上看到的一个n皇后解法,网址:https://mp.weixin.qq.com/s/yH2UpAWKIlywIhhw7tNzbQ
里面给出了看起来很厉害的mma使用方法,我不大懂啥意思,
比如,f:_Or:>Sort[f],还有/.{iter__}:>以后的部分。
我自己写的运行速度比它慢了不少,真的很想弄懂这个n皇后的代码。
Clear["Global`*"]
n=15;
cf=With[{X=Symbol["x"<>ToString[#]]&},
Table[{X[j+1],
If[Or@@Table[X[j]==X[j-i]||Abs[X[j]-X[j-i]]==i,{i,j-1}]/.
f:_Or:>Sort[f],
0,Evaluate@If[j<n,n,1]]},{j,n}
]
]/.{iter__}:>
Compile[{{x1,_Integer}},
Module[{cnt=0},Do[cnt++,iter];cnt],
CompilationTarget->"C",RuntimeOptions->"Speed",RuntimeAttributes->{Listable}
]
Total@cf@Range[n]//AbsoluteTiming
2Total@Most[#]+If[OddQ[n],Last[#],0]&@cf@Range[n/2+1]//AbsoluteTiming
最后俩行是测试两种不同算法的运算时间
2020年03月05日 14点03分
1
里面给出了看起来很厉害的mma使用方法,我不大懂啥意思,
比如,f:_Or:>Sort[f],还有/.{iter__}:>以后的部分。
我自己写的运行速度比它慢了不少,真的很想弄懂这个n皇后的代码。
Clear["Global`*"]
n=15;
cf=With[{X=Symbol["x"<>ToString[#]]&},
Table[{X[j+1],
If[Or@@Table[X[j]==X[j-i]||Abs[X[j]-X[j-i]]==i,{i,j-1}]/.
f:_Or:>Sort[f],
0,Evaluate@If[j<n,n,1]]},{j,n}
]
]/.{iter__}:>
Compile[{{x1,_Integer}},
Module[{cnt=0},Do[cnt++,iter];cnt],
CompilationTarget->"C",RuntimeOptions->"Speed",RuntimeAttributes->{Listable}
]
Total@cf@Range[n]//AbsoluteTiming
2Total@Most[#]+If[OddQ[n],Last[#],0]&@cf@Range[n/2+1]//AbsoluteTiming
最后俩行是测试两种不同算法的运算时间