Entries RSS
image


Who is reading My blog

SPONSORS

新浪围脖

31

海龟算法解螺旋方阵问题

终于用海龟算法将这个题解出来了。非常感谢徐大哥,希望以后能继续像徐大哥学习更多的关于算法数据结构以及设计模式的相关知识和经验,另外也非常开心能够加入他的团队,也希望他能尽快实现自己梦想。

haigui

点击看效果:方法一   Down   方法二   Down

当我看到这道题时还真的有点不知所措,虽然把基本的想到了但还不知道如何去实现。我和宿舍的另一个一起研究,他在C++里用海龟算法实现了,借助这个思想我又在Flash里实现了,遗憾的是我用的双For输出,所以没有实现一个一个数字出现的效果,是直接全部出现的。而徐大哥当时写的程序是用EnterFrame里用If语句去实现的,所以效果能实现一个一个蹦出数字,但思想上其实都是一样的。

代码部分:

?View Code ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
var N:Number = 10;
var arr:Array = new Array();
 
function init()
{
	//X,Y 轴文本框间距
	var cardSpaceX:Number = 42;
	var cardSpaceY:Number = 42;
	var offsetX:Number = 18;
	var offsetY:Number = 18;
	//循环做二维数组
	for(var i:uint=0;i<N;i++)
	{
		arr[i] = new Array();
		for(var j:uint=0;j<N;j++)
		{
			arr[i][j] = new MC();
			arr[i][j].x = j*cardSpaceX +offsetX;
			arr[i][j].y = i*cardSpaceY + offsetY;
			addChild(arr[i][j]);
		}
	}
}
 
init();
 
var A:Number = 0;
var B:Number = 1;
var C:Number;
//c代表行,V代表列
var c:Number = 0;
var v:Number = -1;
//当前数字
var nowStep:Number = 1;
 
//循环判断转向
for(var i:Number = 2*(N-1)+1;i>=1;i--)
{
	trace("i="+i);
 
	for(var j:Number=0;j<i/2;j++)
	{
		trace("j="+j);
		//为数组添加值
		arr[c+A][v+B].Value.text = String(nowStep);
		trace("["+(c+A)+"]"+"["+(v+B)+"]"+"="+nowStep);
		nowStep++;
		c+=A;
		v+=B;
	}
	//转向变换
	C=A;
	A=B;
	B=-C;
	trace("右转");
}

在以4为例的输出结果中,就可以将算法的执行看的很清晰了。
i=7
j=0
[0][0]=1
j=1
[0][1]=2
j=2
[0][2]=3
j=3
[0][3]=4
右转
i=6
j=0
[1][3]=5
j=1
[2][3]=6
j=2
[3][3]=7
右转
i=5
j=0
[3][2]=8
j=1
[3][1]=9
j=2
[3][0]=10
右转
i=4
j=0
[2][0]=11
j=1
[1][0]=12
右转
i=3
j=0
[1][1]=13
j=1
[1][2]=14
右转
i=2
j=0
[2][2]=15
右转
i=1
j=0
[2][1]=16
海龟算法思想:
参照海龟行走的做法,用一对变量A,B模拟海龟头的方向,根据屏幕坐标的特点,A、B的取值和“海龟头”方向有这样的关系:(0,1)表示向右;(0, -1)表示向左;(-1,0)表示向上;(1,0)表示向下;用另一对变量X,Y模拟海龟位置,“海龟”每前进一步,它的新位置即为X=X+A,Y=Y+B;要海龟向右转,就改变A、B的值,根据数学知识可以得出具体的变换公式是:C=A;A=B;B=-C。下面用自然语言对算法进行描述:让海龟先走n步,然后右转,再走n-1步,再右转,再走n-1步,再右转,再走n-2步,再右转,再走n-2步……如此类推,直到海龟前进的步数为0时停止;而每当“海龟”前进1步,就在它位置上显示一个数字,那么前进n步即重复执行“X:=X+A,Y:=Y+B”语句n次。但如何让下两个循环的重复次数都为n-1呢?解决的方法是:循环n次后,让n的值减少0.5,然后再转回执行同样的循环。扩展到显示n位数,则须留n列的位置,也就是说,海龟水平方向每次得前进n步,才有足够的位置显示大一点的数字方阵,需把Y=Y+B改成Y=Y+n*B就行了。“海龟”算法的优点是简洁清晰。

26

由一个女孩引发的一系列产品

晒下在学校做的东西,原来做东西是需要感觉的。

一个壁纸,还打了个我们红杉的LOGO。

高倩

书签

书签

钥匙挂件,打印出来裁好后效果还是很不错的。

yaoshi

23

令人震撼的雨滴效果

点击下面图片看效果,Flash&Math看到的,又一个非常好的学习的网站。

rain8

rain1

 详细and下载 点击

fount2

详细and下载 点击

18

2个效果

算法真是个很有意思的东西。

第一个是在9ria得到的答案,看来提问真的是个好东西啊。可以用来展示照片,不错的。

 

?View Code ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const x0:Number = stage.stageWidth/2;
const y0:Number = stage.stageHeight/2;
//初始化mc的位置使其中心点与舞台中心点对齐。
var xPos:Number = (stage.stageWidth-mc.width)/2;
var yPos:Number = (stage.stageHeight-mc.height)/2;
mc.x = xPos;
mc.y = yPos;
 
stage.addEventListener(MouseEvent.MOUSE_MOVE, moveTheObject);
 
function moveTheObject(e:MouseEvent) {
        mc.x = xPos + (x0-stage.mouseX)*13/27;
        mc.y = yPos + (y0-stage.mouseY)*11/19;
//13/27和11/19是算出来的,mc.x=-130+(x0-stage.mouseX)*k,当mouseX=0时mc.x=0;
//mc.y = -110+(y0-stage.mouseY)*k;当mouseY=0时mc.y=0;
}

Down this Example!
这个很多地方都能见到,就不解释了,总算搞出来了。

?View Code ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var xMousePos:Number;
var PLPercentage:Number;
var dist1:Number;
var dist2:Number;
 
stage.addEventListener(Event.ENTER_FRAME,loop);
 
function loop(event:Event)
{
	if (mouseY> 0 && mouseY < stage.height && mouseX > 0 && mouseX < stage.width)
	{
		xMousePos = mouseX;
	}
 
	PLPercentage = xMousePos / stage.stageWidth;
	dist1 = ((-first.width + stage.stageWidth) * PLPercentage) - first.x;
	first.x += dist1/6;
	if (first.x > -1)
	{
		first.x = 0;
	}
	else if (first.x < (stage.stageWidth - first.width + 1))
	{
		first.x = stage.stageWidth - first.width;
	}
 
	dist2 = ((-bg.width + stage.stageWidth) * PLPercentage) - bg.x;
	bg.x += dist2/5;
	if (bg.x > -1)
	{
		bg.x = 0;
	}
	else if (bg.x < (stage.stageWidth - bg.width + 1))
	{
		bg.x = stage.stageWidth - bg.width;
	}
}

Down this Example!

17

Wrapper-AS3编写的HTML/CSS渲染引擎

Wrapper是一个使用ActionScript编写的跨浏览器兼容的HTML / CSS渲染引擎。

这有它的源码和一个WORDPRESS的例子,在网页里看就是一个Flash。

在9ria看到的,觉得挺好玩,挺新鲜的,好像很早就有了。

详细

 

screenshot

13

MVC初探

ActionScript3设计模式的一个MVC例子,虽然例子不难,启发很大,分享一下,对MVC总算有深入的理解了。

MVC

Down

11

ActionScript3设计模式

给大家推荐一本书ActionScript3设计模式,老书了,看了几天感觉受益匪浅。

ActionScript3设计模式

ActionScript3设计模式

本书是一本高级ActionScript 3.0设计模式用书。大家或许也一直没有搞明白“高级”一词的含义。高级ActionScript 3.0指的是本书并不包含API引用函数以及ActionScript 3.0的入门基础这些主题。作者假定读者已经具备基础的编程知识,了解ActionScript 3.0的相关原理(至少包括变量、表达式、语句、对象、继承以及基础类的编写方法)。很多书都在讨论如何编写类,而本书讨论的是类设计的多种方式。本书将告诉您何时、为何以及如何使用面向对象中的合成(composition)和继承(inheritance)关系,以及一个个相关联的类如何构成模式。

本书非常精彩地介绍了设计模式,是读者在ActionScript 3中使用设计模式的必备利器!本书指导您从开始到测试一步一步地构建程序,并教大家如何使用具体模式来简化系统程序。通过设计模式,不仅可以创建更灵活、可升级扩展的程序,我们还可以对已有系统进行优化。并且,使用规范的统一模式,我们可以更好地与其他开发人员进行沟通。
市面上很多书都只介绍一些基本的类语法,而本书却进一步教大家如何去确定类的组成,并向大家一一介绍类与类之间的关联。在这本书中,大家可以学到一些简单的编程技巧,以让您的程序更加具有灵活性。本书还有一大特点,就是它包含着丰富的示例程序。
从本书中您将学到下面这些设计模式技术:将一个或多个新wrapper对象拼合在一起,使用装饰器模式在运行时创建新对象类型;使用组合模式简化复杂的层级结构;使用正则表达式查找复杂的文本模式。

Page 1 of 212