|
  
- 帖子
- 1561
- 积分
- 235
- 技术分
- 24
- 在线时间
- 693 小时
- 注册时间
- 2005-12-31
|
1#
发表于 2007-6-19 18:56
| 只看该作者
连连看算法[zszen式连连算法]070626更新
理论和实践的结合,完美的连连看算法
原理是扫描横排或是纵排是否存在全空行/列 只有存在这种状况 连线的拐点才能达到2个以内
070626最新修改
增加了例子,特效算上不到200行代码- //矩阵
- /*
- [0,2,1,0]
- [0,1,2,0]
- [0,1,1,0]
- [0,0,1,0]
- [0,2,1,0]
- [0,1,0,0]
- [0,1,1,0]
- [0,0,0,2]
- [0,2,0,1]
- [0,1,0,0]
- [1,1,1,2]
- [0,1,1,0]
- */
- //前两个是两个目标点,最后一个是整体最大区域 目标点修改 矩阵也需要修改
- //ary = [[0, 2, 1, 0], [0, 1, 2, 0], [0, 1, 1, 0], [0, 0, 1, 0]];
- //trace(outPath({i:0, j:1}, {i:1, j:2}, {i:4, j:4}));
- //ary = [[0, 2, 1, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 2]];
- //trace(outPath({i:0, j:1}, {i:3, j:3}, {i:4, j:4}));
- ary = [[0, 2, 0, 1], [0, 1, 0, 0], [1, 1, 1, 2], [0, 1, 1, 0]];
- trace(outPath({i:0, j:1}, {i:2, j:3}, {i:4, j:4}));
- function outPath(now, then, limit) {
- var mini = Math.min(now.i, then.i);
- var maxi = Math.max(now.i, then.i);
- var minj = Math.min(now.j, then.j);
- var maxj = Math.max(now.j, then.j);
- var limiti = limit.i;
- var limitj = limit.j;
- var haveLine;
- var i = 0;
- var j = 0;
- ///纵列 当用纵列来扫描 行i就限制在两目标点之间
- for (i=0; i<limiti; i++) {
- haveLine = true;
- for (j=minj; j<=maxj; j++) {
- //trace([i, j, ary[j]]);
- if (!(i == now.i && j == now.j) && !(i == then.i && j == then.j)) {
- if (ary[j] == 1) {
- haveLine = false;
- break;
- }
- }
- }
- if (haveLine) {
- var check = unitEmpty({i:i, j:now.j}, {i:now.i, j:now.j}) && unitEmpty({i:i, j:then.j}, {i:then.i, j:then.j});
- if (check) {
- break;
- } else {
- haveLine = false;
- }
- } else {
- haveLine = false;
- }
- }
- if (haveLine) {
- return haveLine;
- } else {
- //行列 当用行列来扫描 列j限制在两个目标点之间
- for (j=0; j<=limitj; j++) {
- haveLine = true;
- for (i=mini; i<=maxi; i++) {
- if (!(i == now.i && j == now.j) && !(i == then.i && j == then.j)) {
- //trace([i, j, ary[j]]);
- if (ary[j] == 1) {
- haveLine = false;
- break;
- }
- }
- }
- if (haveLine) {
- var check = unitEmpty({i:now.i, j:j}, {i:now.i, j:now.j}) && unitEmpty({i:then.i, j:j}, {i:then.i, j:then.j});
- if (check) {
- break;
- } else {
- haveLine = false;
- }
- } else {
- haveLine = false;
- }
- }
- return haveLine;
- }
- }
- function unitEmpty(now, then) {
- //取得两目标点是否其间可穿越,必须是同行或是同列
- var mini = Math.min(now.i, then.i);
- var maxi = Math.max(now.i, then.i);
- var minj = Math.min(now.j, then.j);
- var maxj = Math.max(now.j, then.j);
- //trace([mini, maxi, minj, maxj]);
- var haveLine = true;
- if (mini == maxi) {
- for (var j = minj+1; j<maxj; j++) {
- if (ary[mini][j] == 1) {
- haveLine = false;
- break;
- }
- }
- return haveLine;
- } else if (minj == maxj) {
- for (var i = mini+1; i<maxi; i++) {
- if (ary[minj] == 1) {
- haveLine = false;
- break;
- }
- }
- return haveLine;
- }
- return false;
- }
复制代码 [ 本帖最后由 zszen 于 2007-9-2 17:39 编辑 ] |
先纵向计算
纵向有贯通点,进一步横向检测
如果纵向无法联通,横向计算
横向有连通,进一步纵向检测
-
-
核心算法.swf (622 Bytes)
-
-
核心算法.zip (8.56 KB)
-
-
my link up.swf (5.41 KB)
linkup简单实例[核心算法得到]
-
-
lp.zip (21.63 KB)
linkup实例源文件
|
http://zszen.host6.heyhost.cn/wp |
|