1 l# }6 w! O/ f
主要逻辑为: 2 b5 X' N, G. Owhile(search(0)!=search(aa*aa-1))//主要思路7 C' j. F' [/ V2 v
{% \, S) G$ x2 b3 X; w {+ L" G
var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数3 c5 @5 v+ J* o9 P8 x9 n
var neihbour=getnei(num); $ h Y F( [4 c6 \. _# c9 N2 \8 n if(search(num)==search(neihbour)){continue;} ' o: X& G5 g ~! G3 j% ] else//不在一个上* u+ m9 G; [. p; R# h a9 Y' K
{ ; _3 W" ~- z% g2 K isling[num][neihbour]=1;isling[neihbour][num]=1;, }, s, v# `7 I
drawline(num,neihbour);//划线 / ] ?( Z" ?, [8 O union(num,neihbour);9 e- W- o! d8 w' Z
* [0 i% m, x# R( \. }$ n }6 ^. D: v+ w# f1 }7 y
}+ s8 b Z* l3 q, F
# ~' G* }1 u& f, l% U* [) m. B6 Z3 `' J7 U% m4 C Q
那么在前面的代码为" a y0 E3 q) l4 ~ [
<!DOCTYPE html> 1 F- ]: d+ R& ^1 a& h2 |<html>' u6 Z2 g2 h. q7 b P7 |- z& I
<head>: ?8 D! P, N1 t( V- c6 M' }
<title>MyHtml.html</title> " p! A7 l/ q+ ]4 b6 U
</head> # w |4 k6 F/ I& n
<body> + b) R4 V p( v# {3 c8 W+ R/ J <canvas id="mycanvas" width="600px" height="600px"></canvas> 4 ?1 p. [8 z7 Z: K: p0 v' Y0 ~5 Y % b6 g+ m0 a! M, \& Z5 {* W </body># J2 r) D1 g. o5 ~4 _/ _
<script type="text/javascript">) Y5 _# X" n. O! _1 ^+ V5 j8 o. A
//自行添加上面代码 7 ^9 J. U. e$ B/ \9 U7 G // var mymap=new Array(36); , s N% b$ P0 B/ i% ~2 u t // for(var i=0;i<36;i++)9 e) d& L$ I4 P% W% L# V) C
// {mymap=-1;} # F( S8 B: k' Q' x% v function getnei(a)//获得邻居号 random 5 p5 e8 \# R4 v: T* w# N { 2 j8 \! X% n1 ^" E( l& z$ |4 ] var x=parseInt(a/aa);//要精确成整数2 e6 @1 W8 z* ^& _" I
var y=a%aa;( C7 @6 @+ j8 c* I6 {* a6 r2 f4 i
var mynei=new Array();//储存邻居( x! F7 Y9 ]0 k4 r+ ?
if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点 0 X" X: @$ q" M I; V" X: W; b if(x+1<14){mynei.push((x+1)*aa+y);}//下节点6 l. W1 {0 @2 v# j7 l& {
if(y+1<14){mynei.push(x*aa+y+1);}//有节点 0 L4 l5 s( ] Y2 c if(y-1>=0){mynei.push(x*aa+y-1);}//下节点3 Y9 B9 h; s }( C3 c; l! n) |
var ran=parseInt(Math.random() * mynei.length ); + ]% w- k& e: L return mynei[ran];1 p5 p: ?0 a, h1 s. V5 {9 A0 E' d
% c& K% R {8 A% j) B! g
} 4 R) l1 P0 W7 E H function search(a)//找到根节点 $ K' B$ m$ V1 p& c" G3 c& H# d {. s3 ~5 _3 F1 I, A7 F
if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点 5 c; N7 N+ ^# r7 W7 e1 L0 N {' W- `+ d0 x+ o0 g! e8 d
return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩7 {3 n) y! q; |$ k1 X5 Y: r# O& f$ {2 [
}! a# t$ I) v8 ]
else $ q9 c: P8 F2 U2 t7 Y5 q return a;6 y. j9 e: t& o0 z# T! x! Z. Z6 h
}. w' p B; O0 h+ h. P/ W/ I6 }" V) A
function value(a)//找到树的大小 . E9 j" `. C( }& N {/ O# U( ]1 b( F$ g- o2 n2 h4 Q
if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点9 ]0 K5 h8 d' E& M* z2 l! P* s
{; W z" ~1 }: |
return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩 + [# m2 H# E# k( U5 d% u9 g }: F& ?0 h+ K! d+ \# `
else 7 h+ y w, ?& B8 X: N4 d9 b( R7 | return -tree[parseInt(a/aa)][a%aa];! X" w& H9 r# H n) n
} 2 B2 W6 v/ @0 ~ P function union(a,b)//合并- N# M7 Y6 l- G+ O$ q% T* [4 g
{5 J% B# x7 g* K$ Q
var a1=search(a);//a根 3 p/ r; @) W$ u1 R var b1=search(b);//b根 6 E1 E' K7 F+ k1 e if(a1==b1){} 8 j& i/ z! N- m S% x0 I3 X2 C else $ h, B/ Y7 y4 _4 i7 j { % S+ v+ D) d8 X5 w; H3 | j1 ^: `7 f if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数9 z0 |6 o7 M1 N6 @# a
{, B. O2 o7 T! o* u0 ~7 F9 I
tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加 注意是负数相加; }2 O9 C1 E( l
tree[parseInt(b1/aa)][b1%aa]=a1; //b树成为a树的子树,b的根b1直接指向a; 0 ^7 J* a( ?+ J7 k! a' E }$ \, k* Q* `% u/ j
else$ F1 r; Z5 t" E6 z+ F- Z
{0 F, ^4 l1 w; A. w0 Z* Z
tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa]; l5 X2 ^+ ]8 V
tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树 , K0 y/ U1 `: N } % V7 r) a; y" b6 p, C }9 U& H+ }1 @& q+ X( I6 n, J/ n
}: G( t/ `6 d' D9 N) I
, X' n3 q2 V4 a( _7 t7 F2 e
function drawline(a,b)//划线,要判断是上下还是左右 : e2 z. C6 w% S5 _* }0 D3 J {5 |# S4 D$ O$ G% w9 C' l3 a5 N2 w
9 Y: h% [/ j) N. T) m! P' Z4 w var x1=parseInt(a/aa);/ {; B. t/ }3 ~8 x0 }/ @1 n, K& r
var y1=a%aa; 6 ]/ _( e" w) b% N, T9 |2 V6 H var x2=parseInt(b/aa);% W( [/ x$ i: a. Q' l$ V' R
var y2=b%aa; ! @ r9 b/ [. E8 B @
var x3=(x1+x2)/2;! Y9 P G, ]. ^
var y3=(y1+y2)/2; , x% H) W5 c& [7 h2 y if(x1-x2==1||x1-x2==-1)//左右方向的点 需要上下划线0 O$ |* v v3 O1 v7 R
{# m' @6 z: z4 s! H3 n, f h
//alert(x1); 0 x+ c3 w0 }0 \( L6 M8 s // context.beginPath();% y# O* Q% w5 B! C4 `
context.strokeStyle = 'white'; i% c. w: t9 Z: N+ S2 I; | // context.moveTo(30+x3*30,y3*30+15);// 2 d0 V" U7 Y9 `& ^0 o // context.lineTo(30+x3*30,y3*30+45);. {7 Q Y4 r" a$ z# t' |+ k
context.clearRect(29+x3*30, y3*30+16,2,28); * Q# G0 e& i. p n* c // context.stroke(); . V. w) T) P& a8 n. f } 6 E0 }: s. y/ V6 n. x else9 _. K0 @/ F7 k2 g3 `3 {
{8 F" g; p3 \! Y; {/ D. b! H0 M4 `
// context.beginPath(); , n! U' m( S1 R- N' B context.strokeStyle = 'white'; K9 R) p$ m& Z* `. ~% D // context.moveTo(x3*30+15,30+y3*30);// 5 k0 |6 L# b* E0 Z4 A9 u+ U // context.lineTo(45+x3*30,30+y3*30);# [! ^/ T# }8 B) @: p3 H
context.clearRect(x3*30+16, 29+y3*30,28,2); ' \5 Q, w; F2 U2 U. u; A // context.stroke(); . M5 E( ]+ W1 N Y" w* {: d& W+ l }) m) u- ]8 k9 K. |
}+ ~# L+ Z. Y2 y9 W. \
0 N7 P1 Z& W! u; l$ y! Y while(search(0)!=search(aa*aa-1))//主要思路 " Q/ y9 y( H8 x+ M7 L { $ v4 p, x1 N* R) L) n8 V" { var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数3 ?7 f& u. C2 j
var neihbour=getnei(num);9 [* k) K% X, O# ], \7 b/ [* M
if(search(num)==search(neihbour)){continue;} ! `( K7 R$ ~0 f/ Z& q- P6 e else//不在一个上% N G' `/ d- K' _8 T6 x) J% I3 [
{4 z8 ?( s! w4 Y
isling[num][neihbour]=1;isling[neihbour][num]=1; ; W1 e, M+ M* |( v. X8 Q3 Q drawline(num,neihbour);//划线1 Z9 C; B4 r) [' Y6 H& {
union(num,neihbour); , ~9 m1 t* P9 U* d+ s1 ` 8 h0 x+ j" S( M6 Z7 L }6 c' L+ C8 k( s) s7 g8 b9 N6 [
}% o8 ]7 r4 E3 g1 N5 W% _
</script> % q b, u# H2 X. W. S0 e2 n</html>) A8 o* i/ @! h5 B