根据指定每行的排列个数排列对象

private function arrangeByRowNum(objs:Array,rowNum:int,hGap:int,vGap:int,startX:int,startY:int):void
			{
				var n:int = objs.length;
				for(var i:int = 0;i<n;i++)
				{
					var row:int = int(i/rowNum);
					var col:int = i%rowNum;
					objs[i].x = startX+col*(objs[i].width+hGap);
					objs[i].y = startY+row*(objs[i].height+vGap);
				}	
			}

private function init():void
			{
				var objs:Array = [];
				for(var i:int = 0;i<36;i++)
				{
					objs[i] = new Panel();
					objs[i].width = 100;
					objs[i].height = 100;
					addChild(objs[i]);
				}
				arrangeByRowNum(objs,7,10,10,0,0);
			}

 

下面是n年前我写在闪吧的一篇关于数独游戏算法分析的文章,重温一下:

 

普通数独游戏就是将1-99个数字填入到一个9*9的矩阵中,使矩阵的每行(9行),每列(9列),每块(9块)都没有重复。何谓块?将9*9矩阵分成33*3的小矩阵,每个小矩阵即叫块,如第一块是前三行的每三个数,第二块就是前三行的每46个数……依此类推。

9*9矩阵中,行,列,块的计数都从0开始,矩阵中的每个数的位置用单元格来编号,即有012,……80个单元格,编号0-8的单元格为第0行,编号9-17的单元格为第1行,……以此类推……编号为72-80的单元格为第8行。

 

基础算法:(设81个单元格组成一个一维数组,为soduku。)

 

现在假设知道某个单元格的编号为cell

1、要算cell所在的行row,则有row = Math.floor(cell/9)

2、要算cell所在的列col,则有col = cell%9

3、要算cell所在的块block,则有block = Math.floor(Math.floor(cell/9) / 3) * 3 + Math.floor(cell%9) / 3);

 

查找行列块算法 

 

1、假设知道某个单元格所在行的行号为row,要遍历这一行,则有:

for(var i:int=0;i<9;i++){

   var temp:int = soduku[row*9+i]

   trace(temp);

}

2、假设知道某个单元格所在列的列号col,要遍历这一列,则有:

         for(var i:int=0;i<9;i++){

           var temp:int = soduku[9*i+col];

           trace(temp);

         }

3、假设知道某个单元格所在块的块号block,要遍历这一块,则有:

         for(var i:int=0;i<9;i++){

           var temp:int= soduku[Math.floor(block/3)*27+i%3+9*Math.floor(i/3)+3*(block%3)];

           trace(temp);

         }

 

posted @ 2011-11-20 13:12  ywxgod  阅读(284)  评论(0编辑  收藏  举报