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-9这9个数字填入到一个9*9的矩阵中,使矩阵的每行(9行),每列(9列),每块(9块)都没有重复。何谓块?将9*9矩阵分成3个3*3的小矩阵,每个小矩阵即叫块,如第一块是前三行的每三个数,第二块就是前三行的每4至6个数……依此类推。
将9*9矩阵中,行,列,块的计数都从0开始,矩阵中的每个数的位置用单元格来编号,即有0,1,2,……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);
}