理论和实践的结合,完美的连连看算法
原理是扫描横排或是纵排是否存在全空行/列 只有存在这种状况 连线的拐点才能达到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 编辑 ]