z 字型 读取 矩阵

以 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>



------
根据要求用c语言完成代码,并且能在deevc++上运行 1. 目的与要求 (1) 游戏规则:7种状态的方块(长条型、Z字型、反Z字型、田字型、7字型、反7字型、T字型)随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便以万家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。 (2) 游戏界面:游戏的背景色是黑色,方块用蓝色,在一定区域内运动和变形,落下后的障碍物用黄色显示。 (3) 游戏形状:由数组作为存储方块状态的数据结构,各个方块要能实现下落、移动、旋转,旋转可设为顺时针或逆时针变形,一般为逆时针,实现下落底部方块的处理。 (4) 键盘处理:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。 (5) 鼠标事件:通过点击菜单栏中相应的菜单项,可以实现游戏的开始、结束,方块形状的变换,分数、等级的显示,以及游戏帮助等功能。 (6) 显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。 (7)实现用户排名功能,要求能够将排名信息进行保存,存至文件永久保存。 (8)当新用户的成绩需要插入排名列表时,要能够修改原列表信息;如果是同一用户需要更新成绩,则覆盖原成绩。 (9)插入、修改、删除排名信息等要求使用链表实现。 2. 实现提示 (1) 方块如何实现旋转:通用的方法是旋转90度,还可以把每个方块各种变形的样子都用结构体定义好,形成一个封闭的链表,变形一次指针指向下一种形状。 (2) 方块是否还能下落:用一个带有返回值的函数,若碰撞则说明不能下落,返回1;反则说明没有碰撞,返回0。即将整个4×4方块数组下落看成一个单位长度,与游戏空间数组有重叠的1,则在当前位置4×4数组是1的地方赋值给游戏空间对应的数组元素,表示停止下落,并画有1 的地方。对于左移、右移一个单位长度有重叠的1 ,则不允许左移、右移,继续自然下落。 (3) 方块如何实现消行:先认为每一行都是满1的,从游戏空间的数组由上到下扫描,一旦测试到某一行中某个列元素为0,则认为这一行没满,跳出这行的扫描循环,进入下一行的扫描。若扫描完某一行的元素都没有发现0,则以这行以上的每一行完完整整地将上一行的元素赋值给下一行,这个过程以由下到上进行,然后将整个游戏空间画黒,再在有1的地方画小正方形。
最新发布
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值