- 注册时间
- 2018-12-8
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 3549
- 在线时间
- 小时
|
发表于 2019-11-30 08:33:58
|
显示全部楼层
本帖最后由 dlpg070 于 2019-11-30 08:45 编辑
画图部分只是一个自制简易视觉调试工具,
解题完毕,则其任务就结束了
应要求把画图部分附上,没什么特色,倒挺好玩的(集中在代码尾部,测试通过)
- Clear["Global`*"];
- (*判断 line 是否全联通,ok 待优化 ,改进 True/False 各岛建桥情况: arr[] 1:联通 2:未联通,有另外1组 0:无桥 *)
- isok[line_]:=isok[list]=Module[{ret=True,x=0,y=0, arr=Array[0&,{Length[line]+1}]},
- x=line[[1,1]];
- y=line[[1,2]];
- arr[[x]]=1;
- arr[[y]]=1;
- Table[
- Table[
- x=line[[j,1]];
- y=line[[j,2]];
- If[(arr[[x]]==1) || (arr[[y]]==1),arr[[x]]=1;
- arr[[y]]=1](*;
- Print["i=",i," j=",j," arr=",arr]*),
- {j,1,Length[line]}],
- {i,1,Length[line]}];
- x=Sum[arr[[i]],{i,1,Length[line]+1}];
- If[ x !=(Length[line]+1),ret=False];
- ret(*{x,arr}*)];(* end *)
- time1=AbsoluteTime[];(*#计算时间开始*)
- nn=6;(* 岛数 *)
- resline={};
- tup2=With[{n=nn,m=2},Subsets[Range[n],{m}]];
- Print["tup2 长度= ",Length[tup2]," ",tup2]
- tup2line=With[{n=Length[tup2],m=nn-1},Subsets[tup2,{m}]];
- Print["tup2line 长度= ",Length[tup2line]]
- Do[(*i *)line=tup2line[[i]];
- If[isok[line]==True,AppendTo[resline,line]]
- ,{i,1,Length[tup2line]}]
- Grid[Table[{j,resline[[j]]},{j,1,Length[resline]}]];
- (*如果去掉分号则格式化显示各个建桥方案*)
- Print["=== ==="]
- time2=AbsoluteTime[];
- Print[ToString[nn]<>"岛"<>ToString[nn-1]<>"桥全联通建桥方案数= "<>ToString[Length[resline]]]
- (* 绘图用 简单的视觉调试工具*)
- pts=Table[{Sin[Pi*2/nn*i],Cos[Pi*2/nn*i]},{i,0,nn-1}];
- (*点序号变坐标 岛桥专用,已修改 *)
- fm[n_,line_]:=Module[{i=n,lst={},x=0,y=0},
- x=line[[i,1]];
- y=line[[i,2]];
- AppendTo[lst,{pts[[x]],pts[[y]]}];
- lst
- ];
- (*画一张图*)
- gra[lines_,pts_,xh_]:=Graphics[{Opacity[0.7],Green,Circle[{0,0},1.0],Table[{Red,Disk[pts[[i]],0.1],
- Opacity[1],Black,Text[Style[ToString[i],Bold,FontSize->10],pts[[i]]]},{i,1,nn}],
- Black,Arrow[#]&/@lines,Disk[{0,0},0.05]},Axes->False,PlotRange->{-1.1,1.1},
- PlotLabel->Style[Framed[" "<>ToString[xh]<>" "],10,Blue,Background->Yellow],ImageSize->100]
- listgra={};(*图形列表*)
- lines={};(*连线坐标*)
- For[i=1,i<=Length[resline],i++,
- lines={};
- m=resline[[i]];
- Do[AppendTo[lines,fm[j,m]],{j,1,Length[m]}];
- AppendTo[listgra,gra[lines,pts,i]]
- ];
- out=Table[
- listgra[[i]],
- {i,1,Min[50,Length[listgra]]}](* ;-不显示图形 ,50是任意选择值 *)
- (*为了在图形太多时,选取显示少量 (50)样本*)
- Export[ToString[nn]<>"岛"<>ToString[nn-1]<>"桥.png",out];
- Print["测试 Import:"]
- Import[ToString[nn]<>"岛"<>ToString[nn-1]<>"桥.png"]
- Print["耗时 ",time2-time1]
- Print["--- rnd ---"]
复制代码 |
|