4 D, e4 ]& Q- F6 O4 S) I& s
主要逻辑为: i( Q- K. k6 u0 U3 Twhile(search(0)!=search(aa*aa-1))//主要思路& Q% }" |& Y. [2 j) O
{+ j9 h* m8 Z+ m; L; Y q% y
var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数3 t6 w6 x& h9 T" G: z! M: ~
var neihbour=getnei(num);# j8 r2 d; y, C" ?0 d w
if(search(num)==search(neihbour)){continue;} . e% M6 z7 K: M& q! l3 @( B else//不在一个上 . g" ? g" F2 x% @ {4 F# H. D& Q' J; R4 \
isling[num][neihbour]=1;isling[neihbour][num]=1; 0 N. Z# E7 W: c, L) ] drawline(num,neihbour);//划线 ! v* A J: e; ~6 \ union(num,neihbour); ' [0 W1 T" ] M0 O/ K4 L6 ~1 Y- {: i, z; J, v; L
} , s2 Z; i- x+ b" \1 w% A; Y }1 H' V8 \- ?) m% P& u' t: w5 c
3 T! O; E. ^$ H" h1 x$ t' p5 G; m, n, ?; g3 {+ h+ p' S
那么在前面的代码为# @1 `6 B( |3 G' q/ X. U4 Z& v9 w* E
<!DOCTYPE html> . e; o* }& Y# M T! |1 R) _<html>8 v$ S% d* P5 V" I
<head>! T; K: E# O: |5 W0 B9 x7 `
<title>MyHtml.html</title> 9 `* k% k8 |! e, t! E% u </head> * `6 J" @, n6 g6 v: u <body>6 |8 X' P$ z+ h) c9 m2 ?( J
<canvas id="mycanvas" width="600px" height="600px"></canvas> / ~2 X: F+ s2 r4 ^/ b5 {! B9 f( o, |! S, p5 n8 D0 D
</body>) |$ D! t" w( ]$ S5 ^1 J/ @. O
<script type="text/javascript">2 V: q8 {/ x$ f# [: Y: L: K* \6 {' U
//自行添加上面代码# F' J' m2 a0 R1 Z2 V' \3 T
// var mymap=new Array(36); 1 I+ X* X2 j! `9 r // for(var i=0;i<36;i++)/ T" o$ f" m6 @
// {mymap=-1;} u0 h, m7 E% p8 h* Y0 X( Y% i function getnei(a)//获得邻居号 random 4 D8 k: ]% J3 k' e$ B {& n9 I# @9 C' A6 `3 `
var x=parseInt(a/aa);//要精确成整数 # J5 g# T" a/ l# o- H+ l; ~ var y=a%aa;9 X( o' ]: d: F7 M
var mynei=new Array();//储存邻居 4 s3 b5 S8 U4 q6 h8 d if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点4 I6 z. o/ l0 A
if(x+1<14){mynei.push((x+1)*aa+y);}//下节点, e/ ?, ?* |5 X2 O% U+ C. ^% o
if(y+1<14){mynei.push(x*aa+y+1);}//有节点 2 ~0 }1 @$ \" N' }5 L4 j if(y-1>=0){mynei.push(x*aa+y-1);}//下节点- j8 n( L9 `) b1 b- S
var ran=parseInt(Math.random() * mynei.length ); % f5 I( o q& ^6 T' v' A return mynei[ran]; 9 n1 o' v$ d, V5 z. h5 o( w7 I
} |) Y/ S% r% N
function search(a)//找到根节点 ' z- h) S2 o) V' O# R" x+ B {9 N3 M) u& J/ G! N
if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点 2 f1 N5 B5 I A0 k9 X {2 [7 y( v7 _. }+ J" h
return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩3 D6 ?$ \, o2 ]9 Q
}: S6 X8 D# y. K4 z$ I% ] [" Z+ T
else. t% m/ a: L% v, Z0 [. `6 J
return a;; v8 a% z0 c H E/ k; R+ X& Y
} 6 s5 a8 j. c- [ function value(a)//找到树的大小 + @, J3 Z& T6 Z: j# j {+ ^: h% u% X; i/ t7 d) Y
if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点6 d2 |8 ]1 A% q# ~5 Y f
{3 z2 C i0 M9 d5 S/ x
return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩 9 o8 p( J, h K& o } / n6 F# Z9 M; K+ B. ^ P8 }6 j else# l% l" O7 w8 x; ?
return -tree[parseInt(a/aa)][a%aa]; $ S: p9 d6 K+ Z M% E- F) ]% G" F } 6 Z6 J) z8 ]6 z1 V: {# @9 w function union(a,b)//合并$ [/ p4 i* S7 r$ K: a5 f! I4 ~
{) Y! E9 P, m0 x$ v. J
var a1=search(a);//a根 , w; L8 S! Z0 M' g G var b1=search(b);//b根" T0 @% O* j, Q
if(a1==b1){} 6 Q- H* K1 r# X/ K, @8 y5 p else ; T1 y2 n8 ^) f2 o+ d {) h8 X3 l2 U+ D
if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数 " D& N* Z# B+ c% |5 ^ {6 l: d6 F0 X! |' B; K) E3 _
tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加 注意是负数相加 ' \4 f+ @2 ~9 ?6 k tree[parseInt(b1/aa)][b1%aa]=a1; //b树成为a树的子树,b的根b1直接指向a; 4 T/ Q6 @! H \& ]* ?$ c }' e5 G; i" m t. ]+ h- Z: s# a
else 4 @, H& O3 W2 H" T- S0 o4 R { & F3 n6 l) R3 |9 b, d& N tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa]; 0 v. ^2 ?9 v- _ tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树 6 h3 t$ ?8 Z9 t2 U3 B' Y& b } & M3 x# Z) J' V# J } 7 C% O* X X* G" ]- O }# d+ U1 w% _% O" s
1 U- J" G" {5 X3 h% T: ?) `6 C function drawline(a,b)//划线,要判断是上下还是左右9 H; Y/ F" K- h. O/ ?( F9 D: B
{2 k+ S# U7 n) e3 u
3 y8 l0 |& Y- g* H
var x1=parseInt(a/aa); ' Q9 d2 O. t& @6 {% o5 W: w var y1=a%aa;; o. z: I8 }* S& m+ ~
var x2=parseInt(b/aa); 5 d3 ?9 {" O* R! g1 y2 \ var y2=b%aa; : G0 s2 M' H) ]% }3 I. n3 N
var x3=(x1+x2)/2; - U Q7 }" O- o3 w var y3=(y1+y2)/2;6 I: s( y/ M6 Z
if(x1-x2==1||x1-x2==-1)//左右方向的点 需要上下划线 ; p( Q) c9 e) t. R {$ b* W L: u+ [' q+ U! f
//alert(x1); . b, T0 b6 `* \) o/ e/ ^5 V% J // context.beginPath();' v& G) j' n" u$ d& M: e
context.strokeStyle = 'white';! P- ?) X! _* f1 S2 n; i' l
// context.moveTo(30+x3*30,y3*30+15);// S2 |5 w" |, P* U1 b // context.lineTo(30+x3*30,y3*30+45); / {3 u! G3 r2 \ [# F/ q8 s& Z context.clearRect(29+x3*30, y3*30+16,2,28);, J0 a. K0 @5 e$ i8 H2 ~4 R
// context.stroke();+ w) |1 W; N+ p
}$ e% D5 t- z$ j# \# k
else / K0 `1 g0 P$ T+ L* }/ ?3 I, D { d6 s: O6 n! ?- d! T
// context.beginPath();3 K' z8 ^3 l# f5 c4 [
context.strokeStyle = 'white';; T' }! d' [! V3 v
// context.moveTo(x3*30+15,30+y3*30);// 2 `* k1 n- W' u8 [ u# d // context.lineTo(45+x3*30,30+y3*30); : \6 \/ x+ T. S& M context.clearRect(x3*30+16, 29+y3*30,28,2);' l9 A7 M* k" x
// context.stroke();* B+ L7 S4 Q- X( w
}# p$ b1 C, M4 @
} ( X" |$ F$ L! O# @4 N) ]. y9 x8 `, e' I& @* r1 o
while(search(0)!=search(aa*aa-1))//主要思路 : c4 W- p8 T9 ~. V7 V { % r% b1 g* ^7 l& N7 k: s5 e var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数 9 Y4 [% g+ t$ y8 |, C0 X% R var neihbour=getnei(num); - ~" f, A6 Y( f+ j" q- }# a/ V) X. L if(search(num)==search(neihbour)){continue;}- K' l8 y( G3 u( b) ]
else//不在一个上 ( O9 |+ m. h- `. R- H { 9 G2 T+ P2 I- v- U. ]$ A isling[num][neihbour]=1;isling[neihbour][num]=1; 0 b6 N8 n' U d drawline(num,neihbour);//划线2 n- u7 r, D% Z
union(num,neihbour);8 y5 {6 G5 G# Q
' T% A4 N+ l' A& c4 K7 H! Z W } # c+ U n, ^( o# w b1 D } - W E+ T$ x9 f, w. _# G/ ~+ o </script> - o% ?0 m: V" Z! k( n6 V</html>9 v" `, ~9 ~3 c# L! D. q
6 y, a/ ]& T; L) d) p 8 t! ~4 g4 m* D/ {6 ~实现效果: + D, l, Y: T5 h" y5 A, z* P! q/ l* A& R5 J% J' |, M" ^ C, A