论坛首页 综合技术论坛

蛇形数组算法讨论

浏览 2431 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-29   最后修改:2011-10-29

把 m* n 个整数以蛇形或 S 形填写到二维数组里,
比如

 

 

1 2 6
3 5 7
4 8 12
9 11 13
10 14 15

 


我已经做出基本的实现 ,思路和螺旋数组类似,仍然是判断到边转向。想请各位一起据探讨一下算法和性能。

 

var echo = function(str) {
	document.write(str);
};
var s = function(totalX, totalY)
{
	// 初始化一个二维数组
	var a = new Array(totalX);
	for (var i=0; i< totalX; i++)
	{
			a[i] = new Array(totalY);
	}


	var x = 0;
	var y = 0;
	var total = totalX * totalY;
	var out = 0;

	// 起始的方向很重要,得能给 0, 0 之后的第一步判断出 right 的方向,由 if ('rightup' == direction && 0 == x ) {direction = 'right';} 知 right 前的方向是 rightup,所以起始方向用 rightup。
	var direction = 'rightup';

	// 开始转向和填数
	while (out++ < total)
	{
		a[x][y] = out;
		if (('right' == direction && 0 == x) || ('down' ==direction && totalY-1 == y))
		{
			direction = 'leftdown';
		}
		// 额外加个条件 x < totalX-1,是为了在左下角时使其不会超出 y 坐标上限
		else if (('leftdown' == direction && 0 == y && x < totalX-1) || ('rightup' ==direction && totalY-1 == y))
		{
			direction = 'down';
		}

		else if (('down' == direction && 0 == y) || ('right' ==direction && totalX-1 == x))
		{
			direction = 'rightup';
		}

		else if (('rightup' == direction && 0 == x ) || ('leftdown' ==direction && totalX-1 == x))
		{
			direction = 'right';
		}
		switch (direction)
		{
			case 'down':
				x++;
			break;
			case 'right':
				y++;
			break;
			case 'leftdown':
				x++;y--;
			break;
			case 'rightup':
				x--;y++;
			break;
		}
	}
	echo('<table border="1" cellspacing="0">');
	for (var i=0; i< totalX; i++)
	{
		echo('<tr>');
		for (var j = 0; j < totalY; j++)
		{
			echo('<td height="40" width="40">' +a[i][j]+ '</td>');
		}
		echo('</tr>');
	}
	echo('</table>');
};

s(5, 3);
s(4, 4);
s(3, 5);

 

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics