$ k! W2 I b% X8 l3 e主要逻辑为:" d G; z2 W& |: T% m* r: d
while(search(0)!=search(aa*aa-1))//主要思路# Q; R7 E& m9 v- q* q
{ - C6 M) m$ X8 C var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数 & L: {4 G. Y" d6 R* a: C var neihbour=getnei(num); 7 _% c9 O( q& k/ H Q0 e9 C# @ if(search(num)==search(neihbour)){continue;}" {* C! N5 {% I
else//不在一个上& o, o, C7 m( ?& q% U4 ?! N3 U
{3 b, _# U, f2 `% U/ n+ Q
isling[num][neihbour]=1;isling[neihbour][num]=1; ' i, X# Q' b) T: f drawline(num,neihbour);//划线 $ X6 b( r# S. P: n( C union(num,neihbour);7 t5 U1 E, v* V% K5 d7 |) t
& C2 T6 K' w8 @8 o# `. A+ n7 U. ? } 4 P y, c- P+ M j: C8 \ k }$ p+ |9 L( H! t- I* b8 C
* i' z, C" ]8 l! [9 s# N: U* h6 }
( @+ q3 t) d2 j, |; m1 p, f
那么在前面的代码为( B! r( t$ Y! H( [( w3 g
<!DOCTYPE html>( N0 v4 s) Y2 f9 l( L# Q
<html> # K6 ^. L* L' B, o- x; Q: O) e <head> & v" h2 s( J; B( Z& ~; x9 H <title>MyHtml.html</title> . T% {, L+ G: k% d9 Z$ ?, h </head> # r' a1 P/ r# w) r <body> 8 M+ q% @0 K1 P: S( j, K! J <canvas id="mycanvas" width="600px" height="600px"></canvas> # e, x7 D' `6 Z y + s$ Q/ I5 U5 O# J/ r% h </body> - Y2 b3 F7 U, O- w( a2 x <script type="text/javascript">% {+ ^9 H1 \% s i4 {
//自行添加上面代码 $ G* \5 u2 ?4 i/ B+ q& ^ // var mymap=new Array(36); $ v5 Z, {; O2 y& c% b- L0 e // for(var i=0;i<36;i++) ; c: b. i$ q& x1 n! A# y4 p! [ // {mymap=-1;} % o4 m) }$ T. a function getnei(a)//获得邻居号 random. e0 W. J( ^6 l9 j& L4 X$ Z- F
{ 3 e+ E1 J" B: f var x=parseInt(a/aa);//要精确成整数 ; O/ k$ ~) b F. ~- X5 F1 ]! s var y=a%aa;5 I) Y9 f0 S1 f2 g% [4 K. ~+ o+ p5 m
var mynei=new Array();//储存邻居/ q# Y5 `& l8 S* y
if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点 4 |% z2 t/ G$ i2 L1 B2 u if(x+1<14){mynei.push((x+1)*aa+y);}//下节点$ l; x, e! J9 @ {4 [) G# r
if(y+1<14){mynei.push(x*aa+y+1);}//有节点- k# R: \# G7 k* ~5 K
if(y-1>=0){mynei.push(x*aa+y-1);}//下节点 Y. x9 s! d. k2 g2 t
var ran=parseInt(Math.random() * mynei.length ); 4 D, n& j: e6 _: g0 ] return mynei[ran];) `/ d) E7 x4 @& r* S' X0 L% c# b
0 D; D* R* ^; o# | }& E) d8 `7 [! v1 W/ {% d
function search(a)//找到根节点5 R; n1 X3 o5 n z9 g4 G
{- o! ~! i0 ~5 `. u' q- ]2 b
if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点# }6 e$ p: z( o- N' S3 y h5 Y5 `7 c! O- g9 W
{ , r k- g3 W) q7 k return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩4 y1 \' I. n0 G" g M
}9 Q: ^+ v& P0 d
else8 L! I7 H: J7 D; M8 S
return a; 0 J: _( D% n0 G5 i }4 c: n: S5 {2 W- o% H# j
function value(a)//找到树的大小; }! ], n+ o0 {# n. l; O
{: v: A% p0 H8 r t! ]
if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点. [/ |8 l0 \. {3 i" \$ Z2 O
{. A( ~, D+ W8 \5 k& a, A
return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩 ( q& ?! F V8 Y4 T. ?! H! ` } 1 B# b( ~/ x: O* l' F9 f7 ^ else : }0 R6 y- S6 r9 d, H return -tree[parseInt(a/aa)][a%aa]; ) W+ x6 S1 z. J4 E0 _- { }: C& }; \" b6 \2 `, S+ h% I+ o2 Z4 {
function union(a,b)//合并 8 E1 x4 _+ z& ^5 \4 o- l { ^1 T0 B; L3 r% @0 l. U/ F var a1=search(a);//a根+ w! B) n/ P: g% S) @* r5 e
var b1=search(b);//b根 0 w7 ~: V) t& P* m2 |# O2 b+ b8 l if(a1==b1){} 6 j% [2 u' m. `9 c5 } else 8 V, H+ [ Z( C$ H {6 K1 ^1 S7 ?2 v
if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数# y! }( A7 A9 @% p- B4 _, v: Y
{2 K2 @8 h5 u1 W$ _7 Y
tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加 注意是负数相加 " c$ ^* o; z4 ~( O tree[parseInt(b1/aa)][b1%aa]=a1; //b树成为a树的子树,b的根b1直接指向a;, t0 P2 Z) j/ h( R U: X6 w
}" ?' N& ?# C4 l' {1 n$ @
else ! K# v7 i% L. {& @ X { ) C% [- J) v, {( G0 ]; S tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa];/ [8 D, I8 I/ M/ b+ h/ j
tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树$ B3 z7 G b s
}! V; E# l' I/ k' k
} 7 d6 {' t! h, l# F* P: c5 k* t } ) L; J- }( a, N/ {( O/ j0 I; j4 U4 A; k7 L# x' E3 w
function drawline(a,b)//划线,要判断是上下还是左右3 ~$ C& A2 |- @% }; D: P7 D3 Y
{! O, X' l9 A! H
( B t3 U; q. D. ]3 Q2 N- e var x1=parseInt(a/aa);" y+ o6 L7 }1 h V
var y1=a%aa;' ?: O0 P# q1 O. h9 |1 b
var x2=parseInt(b/aa); ) Q; U0 b: i( O+ q1 j var y2=b%aa; 2 E4 f" W4 y& e+ x* ~* H
var x3=(x1+x2)/2;- s) z. r5 c& A4 B6 B' x" n
var y3=(y1+y2)/2;* B- l$ l6 \8 b$ w$ l; ^( [
if(x1-x2==1||x1-x2==-1)//左右方向的点 需要上下划线 1 }5 [6 [0 |; S+ G$ H4 r- R {" e8 k5 h7 k/ Z. }2 J$ P+ k% y' W
//alert(x1); 0 e) y1 M$ L' C: L0 D // context.beginPath();$ R, }$ ^! \- G p" o" n5 c( T
context.strokeStyle = 'white'; # f& x7 I0 F! x. c3 x, H // context.moveTo(30+x3*30,y3*30+15);//7 ~! a& H# H- f3 \2 k
// context.lineTo(30+x3*30,y3*30+45);, h- Z7 P" ?0 y. ~7 J
context.clearRect(29+x3*30, y3*30+16,2,28); ; \: n5 U4 g9 S // context.stroke(); ; s4 }* i9 v9 k5 d }2 }( z8 U: z2 C3 k9 T1 v
else( u- u7 P/ g: A: x9 Q
{ - E$ b; i) {0 K+ ^8 a // context.beginPath();% K+ Y+ s. D) h
context.strokeStyle = 'white'; ) D5 z! T1 c6 w; l7 _ // context.moveTo(x3*30+15,30+y3*30);//% d5 u* U* G( l; z
// context.lineTo(45+x3*30,30+y3*30);! u. p) |) ^: h
context.clearRect(x3*30+16, 29+y3*30,28,2); / Q9 F5 e( A# K0 D0 s // context.stroke();& E+ M% O5 f# e- Q$ M. c
} 2 L M7 U. ~$ t, s }5 H, X0 K( o7 q# }$ `+ g
, Z+ D2 q! B- a( u- ^# X- J while(search(0)!=search(aa*aa-1))//主要思路% j p z4 A# [: O
{ 1 X V+ M% e: A% \ var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数 / g. p) [4 }: m7 c) J/ D9 j var neihbour=getnei(num);5 r& p* c5 }+ Y. Z; L, u3 i4 Y+ V
if(search(num)==search(neihbour)){continue;}( z+ o) ?9 f) x8 U, A
else//不在一个上 ! D% R' A8 y6 V3 y# A( ?* v' ^ { , `0 j, [5 B' F" v: I isling[num][neihbour]=1;isling[neihbour][num]=1; # P) F3 o& n; L7 [ { drawline(num,neihbour);//划线+ Q1 U) L6 }# ?' U$ a9 F
union(num,neihbour);; N) A/ }4 x8 {, D
+ E0 ?/ s% m9 @
}" p9 p) ^& V: [5 @2 }
} 1 N* C. @ F0 }/ H# ]5 p+ ` </script>1 D+ H. T: ]% O4 ?" ~
</html>0 @/ c1 S$ i6 ]
" P8 a7 W8 i D. c9 g N % B, q R5 M# j+ |实现效果:1 j, T* ~/ O$ J& ]$ Y' `0 R2 S6 n1 j4 V; S7 a
) f1 I5 n+ j- s9 [- F5 [' n# B