以 z 字型 读取 矩阵,
——
[b]思路[/b]:
以矩阵的 左斜切线 为读取单元,
步骤:
* 求出 左斜切线 个数
* 遍历 左斜切线
* 求出 左斜切线的 长度
* 求出 左斜切线的 起点、止点
* 遍历 左斜切线,遍历方向 由 左斜切线的index 决定,
*
*
——
[b]主要用到的数学知识[/b]:
* m 行 n 列 矩阵中
* 共有 m+n-1 个 左斜切线
* 每条左斜切线的长度 = (左斜切线的index + 1) – 该线超出row长度 – 该线超出col长度
*
*
——
[b]示例[/b]:
* [b]js[/b]
/**
* z read array
* @date 2010-10-23 15:30
* @author kuchaguangjie
* @blog http://kuchaguangjie.iteye.com
*/
var arr_one = [
[ 0, 2, 3, 9, 10, 19, 20, 29, 30, 39],
[ 1, 4, 8, 11, 18, 21, 28, 31, 38, 40],
[ 5, 7, 12, 17, 22, 27, 32, 37, 41, 46],
[ 6, 13, 16, 23, 26, 33, 36, 42, 45, 47],
[14, 15, 24, 25, 34, 35, 43, 44, 48, 49]
];
var arr_two= [
[ 0, 2, 3, 9, 10, 20, 21, 35],
[ 1, 4, 8, 11, 19, 22, 34, 36],
[ 5, 7, 12, 18, 23, 33, 37, 51],
[ 6, 13, 17, 24, 32, 38, 50, 52],
[14, 16, 25, 31, 39, 49, 53, 64],
[15, 26, 30, 40, 48, 54, 63, 65],
[27, 29, 41, 47, 55, 62, 66, 73],
[28, 42, 46, 56, 61, 67, 72, 74],
[43, 45, 57, 60, 68, 71, 75, 78],
[44, 58, 59, 69, 70, 76, 77, 79]
];
function zRead(arr) {
// 行数
var rowCount = arr.length;
// 列数
var colCount = arr[0].length;
// 斜切次数
var cut = rowCount + colCount - 1;
// 结果
var result = [];
// 上 或 右 点
var topOrRightPoint;
// 左 或 下 点
var leftOrBottomPoint;
for ( var i = 0; i < cut; i++) {
// 斜线超出 row 的长度
var rowExtraCount = (i + 1) > rowCount ? (i + 1 - rowCount) : 0;
// 斜线超出 col 的长度
var colExtraCount = (i + 1) > colCount ? (i + 1 - colCount) : 0;
// 斜线长度
var len = (i + 1) - rowExtraCount - colExtraCount;
topOrRightPoint = new Point(colExtraCount, i - colExtraCount);
leftOrBottomPoint = new Point(i - rowExtraCount, rowExtraCount);
if (i % 2 == 0) { // 由 topOrRight 向 leftOrBottom 读数据
while (len-- > 0) {
result[result.length] = arr[leftOrBottomPoint.rowIndex - len][leftOrBottomPoint.colIndex + len];
}
} else { // 由 leftOrBottom 向 topOrRight 读数据
while (len-- > 0) {
result[result.length] = arr[topOrRightPoint.rowIndex + len][topOrRightPoint.colIndex - len];
}
}
}
return result;
}
/**
* 行列中的 1个点的位置
*
* @param rowIndex
* 行 index
* @param colIndex
* 列 index
* @return
*/
function Point(rowIndex, colIndex) {
this.rowIndex = rowIndex;
this.colIndex = colIndex;
}
* [b]html 测试文件[/b]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="js/z_read.js"></script>
<script type="text/javascript">
function showResult(arr){
document.getElementById('resultDiv').innerHTML=zRead(arr);
}
</script>
</head>
<body>
<input type="button" value="z_read 1" onclick="showResult(arr_one);" />
<input type="button" value="z_read 2" onclick="showResult(arr_two);" />
<div id="resultDiv" style="width: 300px;border:1px solid green;overflow: scroll;">
</div>
</body>
</html>
——