. i: ?3 @. j' _/ K3 f7 x
主要逻辑为:8 b8 P! U6 r3 i4 i
while(search(0)!=search(aa*aa-1))//主要思路 6 V2 t0 {8 V0 Q! O$ _( R, V { 4 e) |+ E; ^4 S var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数 / j0 w# y6 @* H+ H6 Z4 N0 ] var neihbour=getnei(num);: y {6 O( v: j/ z9 {, V
if(search(num)==search(neihbour)){continue;} _4 l; N3 P$ k
else//不在一个上 " P9 o% {+ e; u6 [7 d/ }! V {! L6 c! ^( g1 u r4 P
isling[num][neihbour]=1;isling[neihbour][num]=1; ' k% h- r# ?" m+ Q2 H2 {4 M drawline(num,neihbour);//划线 G7 G7 m$ }3 G
union(num,neihbour);' G- z% R- P. K- O% c
" n7 z/ F; d# a" } } . ]; [2 t0 h6 U) @" h8 V7 { } 1 y3 c# d: ]" A! e7 |$ N/ C1 B+ H) X+ `' q/ j. J0 c
+ D) T/ w, o3 E2 u/ l
那么在前面的代码为1 j7 \* b5 T0 W
<!DOCTYPE html>5 X. Z+ C2 w6 n5 U1 L
<html> - u @& N% }4 u, Z7 H) R <head> 6 L7 f* n4 L: M! t& A3 X <title>MyHtml.html</title> & H, N5 U, S; T) T! _9 \ </head> 9 q; l2 Y( c# y3 [, f* D+ u
<body>8 k0 i6 j, i! o. D8 y: l- U
<canvas id="mycanvas" width="600px" height="600px"></canvas>, K& q0 K1 X* H" D' C
4 t6 `' k2 V5 G# b9 b
</body> & [! F( @' `# g: z ]" [ <script type="text/javascript"> 9 i0 g4 e4 \% o$ a( D+ U//自行添加上面代码 1 A+ w* a9 a9 k, N" m0 k" B // var mymap=new Array(36); ) F5 M% [6 S D3 I) @: r$ L // for(var i=0;i<36;i++) ; ~8 f$ y- Z& g4 c& Z // {mymap=-1;} * W7 H9 J0 a& M4 }* l function getnei(a)//获得邻居号 random . s6 P* ^& B$ I+ _" p { ( Y0 n; b# N! l5 {; G) D var x=parseInt(a/aa);//要精确成整数 7 Y3 d5 M( R$ j var y=a%aa; ) Z3 t5 k4 l1 X/ X5 c var mynei=new Array();//储存邻居 * k, n4 d7 G# i0 I- \$ K if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点 H' [7 Y* g3 |! z1 M- ?% |+ K if(x+1<14){mynei.push((x+1)*aa+y);}//下节点 1 J' _$ |$ j+ N6 {0 m if(y+1<14){mynei.push(x*aa+y+1);}//有节点 5 @1 I$ m. x) Z5 @1 ` if(y-1>=0){mynei.push(x*aa+y-1);}//下节点% L$ A% i! `+ c. `2 p! k
var ran=parseInt(Math.random() * mynei.length );% i& ^$ i/ L7 _
return mynei[ran]; U* I' U8 r+ a1 m) o8 `( R* s4 e, P0 Q2 I
}/ {: J! n# u. X- j$ @' H
function search(a)//找到根节点 & K1 ^/ c3 Y5 L6 l. E r0 d5 l { / z' `' n* [0 A7 I4 h' m4 L2 I if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点) B" r4 V3 c! i) x
{ ( U. ^( c! j" F( h' @' W q8 P2 } return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩 4 Q4 U$ R8 q% a; `8 L7 j }" W, U; i" d9 y7 O2 ]( A4 z ?+ n8 E5 J
else $ p @. A5 Q$ N: H: ? return a; 6 e6 D3 a# A/ w1 x/ C% W" E }/ z# R0 c7 ?& Q) w
function value(a)//找到树的大小; c: F" V9 j8 X( z1 b1 o0 Y: F a
{ 9 [2 G, c4 Q3 I8 Z; n if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点: U6 L$ k7 Q& @3 d2 N
{) D. R: i& \4 t- ]5 u8 w. t- u* d
return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩 ; l, p% a0 H0 j6 D% R F }% f, q G# W% V0 X$ Z2 [1 F2 G4 x0 e
else : R3 R5 m6 N2 e! a0 F" a, V return -tree[parseInt(a/aa)][a%aa]; * \: {' _& G; ]. I } % i# o: ]( M" L9 S+ z! @0 { function union(a,b)//合并* b( M1 j4 ?( s, N
{ ]: A- L5 N5 ^, j* j$ T' J+ Y
var a1=search(a);//a根# e6 F4 U1 c: J9 }- y# }+ z
var b1=search(b);//b根 : h1 e, E- ~* [2 K- E if(a1==b1){}$ K3 F$ z, m/ l3 g5 B8 U" V6 M" u& {
else5 z5 _7 ^! E- d7 g5 \4 H# Q! j+ D( ^
{7 }7 V: S @% b9 y" m6 D
if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数 + D9 @* r( f+ }. I. W% J0 g q% o { 4 _1 }+ r$ a M& P( s7 G tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加 注意是负数相加# p4 C1 Z9 G+ h3 n. @! O
tree[parseInt(b1/aa)][b1%aa]=a1; //b树成为a树的子树,b的根b1直接指向a; & k! E+ n& ~# R( y o* w }1 l% p' e' w. _5 Q: V
else x9 o6 I9 `. [% W! w0 k- @. ?4 x {6 ^8 f0 F. \: W: m+ M
tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa]; 4 | F9 g; P, [/ a, a% A tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树 5 j. G' D0 J9 T$ V: [, F } 6 S) P m6 ^/ U* {2 e* c2 E3 j } - v0 ?" Z' s3 S+ D, @. S/ w } L& z* M) [6 R- _; K
) q0 \2 V/ j3 R3 N1 t
function drawline(a,b)//划线,要判断是上下还是左右 " E8 Q9 W& K l { / h3 F h3 [( i1 N! z: v$ c+ X0 Z5 ?, ]& S+ {
var x1=parseInt(a/aa); * M J+ y7 ]0 s+ z1 y4 E var y1=a%aa;" e7 L; p- y$ c: O- _
var x2=parseInt(b/aa); : k0 V+ c( L+ O D6 G7 z, n0 C var y2=b%aa; 8 d& q8 |1 o, d! o
var x3=(x1+x2)/2;1 J: g" o8 F r
var y3=(y1+y2)/2;2 W( N; S+ U2 c, m) Q7 A, j
if(x1-x2==1||x1-x2==-1)//左右方向的点 需要上下划线 5 l m- @, i( f) L e8 n. V {/ L+ z; S' x" F$ R& A* m9 k
//alert(x1); ?- Y1 p7 `% d h3 t$ T // context.beginPath(); 6 n3 ~+ }' ~. D8 H2 C5 } context.strokeStyle = 'white'; # d% S% t9 q( O& K R9 o4 c // context.moveTo(30+x3*30,y3*30+15);// $ ?3 y8 B# S* t. ?1 f, O! h // context.lineTo(30+x3*30,y3*30+45); # {! z: Y" f# \- K context.clearRect(29+x3*30, y3*30+16,2,28); i, [: i0 ]# l0 |6 Z% T0 J
// context.stroke();# @+ `5 m0 ?" F. S! _& v
}* M3 P2 y9 w( X& v6 T, O, Y/ ^
else5 A! V3 }% p7 }* [0 [4 C
{ - y. |) _& u0 @9 V# q8 V- F // context.beginPath(); ' |3 y5 M5 z3 u context.strokeStyle = 'white'; ; b: p9 ]% U8 P% K" q k // context.moveTo(x3*30+15,30+y3*30);//7 A& \/ C* k/ O) z, H" d5 u2 F! f! u3 q
// context.lineTo(45+x3*30,30+y3*30); , J3 n, [! [% \5 H( H- v( K context.clearRect(x3*30+16, 29+y3*30,28,2);0 q) Q' ]2 B$ |9 N5 }
// context.stroke(); $ G- C+ a$ ?! g }7 J" y: k, Z, a8 A& P- n+ T" n
}# S9 n+ q& c& C" n
; Z9 B4 g. q9 m; w while(search(0)!=search(aa*aa-1))//主要思路$ M `# ?& [2 v; \# z
{ 4 }3 ~' O5 X& v7 c0 X7 @) j var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数5 O8 I$ p' g$ A' K) J5 X2 o8 f
var neihbour=getnei(num);1 ]: X+ U' Z' @- C6 U8 \* P5 h+ b
if(search(num)==search(neihbour)){continue;}9 N4 ? U9 @* H- [; h; V
else//不在一个上 _4 m7 H# v' J+ I$ f
{0 @$ N' A0 E; W, w) {0 v. S3 G
isling[num][neihbour]=1;isling[neihbour][num]=1;2 B, O) {% p2 d n @
drawline(num,neihbour);//划线 2 p0 ]4 c) w* e; J5 X union(num,neihbour); ) @% P$ m. x9 K, T . s3 K/ Z' T U; P }. [8 U2 Z( M! l* w1 }( V. u
} - R6 l; g) k" m' s5 g/ j </script> ) o8 B8 }5 J+ b. Z</html>; ?$ V2 h6 O( J! d5 E, ]/ v
! x' N3 j; e& y, s % W6 R+ S" }3 k( T0 |实现效果: & W1 T( L( D* D0 I% ^* F' a : D; n' z3 {# X' v' V8 |7 V