锁定老帖子 主题:关于螺旋矩阵问题的新思路
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-03
mfkvfn 写道 最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。
我试过,没有成功,很期待你给出f(n)。 |
|
返回顶楼 | |
发表时间:2011-05-03
最后修改:2011-05-03
我来一个
function ring(tda,column,line){ var xmax = column - 1, //最大的列数 ymax = line - 1, //最大的行数 xmin = 0, //最小的列数 ymin = 0, //最小的行数 alln = line * column, //总共的元素 arry = [], q = 0, i,j; while(q < alln){ i = xmin; j = ymin; while(i <= xmax && q < alln) arry[q++] = tda[j][i++]; i = xmax; j = ++ymin; while(j <= ymax && q < alln) arry[q++] = tda[j++][i]; i = --xmax; j = ymax; while(i >= xmin && q < alln) arry[q++] = tda[j][i--]; i = xmin; j = --ymax; while(j >= ymin && q < alln) arry[q++] = tda[j--][i]; ++xmin; } return arry; } 厄。。。 看错了 得改改 |
|
返回顶楼 | |
发表时间:2011-05-03
public class Test { /** * Create date:May 3, 2011 * Method name:main * Description: [螺旋问题] * return:void */ public static void main(String[] args) { LX lx = new LX(3, 5); lx.print(); } } class LX { private int col; private int row; private int[][] matrix;//二维数组 private int count = 0; private boolean flag = true;//行列 private int x = 1;//增减值 public LX(int col, int row) { this.col = col; this.row = row; this.matrix = new int[col][row]; turn(); } public void print() { for (int[] i : matrix) { for (int j : i) { System.out.format("%3d", j); } System.out.println(); } } public void turn() { int i = 0; int j = 0; int end = col * row; while (count < end) { matrix[i][j] = ++count; if (flag) { j += x; // 触边转向 if (j < 0 || j >= row || matrix[i][j] != 0) { j -= x; flag = !flag; i += x; } } else { i += x; // 触边转向 if (i < 0 || i >= col || matrix[i][j] != 0) { i -= x; x *= -1;//纵方向到边界 flag = !flag; j += x; } } } } } |
|
返回顶楼 | |
发表时间:2011-05-03
codeincoffee 写道 mfkvfn 写道 最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。
我试过,没有成功,很期待你给出f(n)。 公式应该较复杂。 不如直接循环来得省事 |
|
返回顶楼 | |
发表时间:2011-05-04
mfkvfn 写道 最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。
赞~~~ ![]() ![]() ![]() |
|
返回顶楼 | |
发表时间:2011-05-04
mfkvfn 写道 最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。
不见得,这里的需求是全部打印,而不是得到某点的值 全部打印用公式法的话,还要考虑上如何避免重复计算,这样的话,复杂度就会增加很多的。 |
|
返回顶楼 | |
发表时间:2011-05-04
我也实现了下,原理就是建一个一维数组,通过控制下标进行赋值。
http://zhaiyz.iteye.com/blog/1027696 |
|
返回顶楼 | |
发表时间:2011-05-04
我用python写了一个,
# -*- coding:utf-8 -*- class RotateMatrix(object): DIRECTION = {'LEFT':(0,-1), 'RIGHT':(0,1), 'UP':(-1,0), 'DOWN':(1,0)} def __init__(self,x,y,algs=None): self.width = x self.height = y self.start = 0 self.matrix = [['' for i in range(self.width)] for j in range(self.height)] self.pos = (0,0) if algs == None: self.algs = ['RIGHT','DOWN','LEFT','UP'] else: self.algs = algs def disp(self,width=3): return '\n'.join([' '.join(map(lambda x:str(x).rjust(width),i)) for i in self.matrix]) def begin(self,start,pos=(0,0)): self.start = start self.pos = self._safepos(pos) def _safepos(self,pos): assert 0<= pos[0] < self.height assert 0<= pos[1] < self.width return pos def GetPosByRel(self,dx=0,dy=0): x,y = self.pos x,y = x+dx,y+dy if not 0<= x < self.height: x = self.pos[0] if not 0<= y < self.width: y = self.pos[1] return x,y def PosNotExistNumber(self,cmd): dx,dy = self.DIRECTION[cmd] x,y = self.GetPosByRel(dx,dy) if self.matrix[x][y] == '': return True return False def _SetPosByRel(self,dx=0,dy=0): self.pos = self.GetPosByRel(dx,dy) def SetPosByCMD(self,cmd): if self.PosNotExistNumber(cmd): dx,dy = self.DIRECTION[cmd] self._SetPosByRel(dx,dy) return True return False def main(self): self.matrix = [['' for i in range(self.width)] for j in range(self.height)] self.matrix[self.pos[0]][self.pos[1]] = self.start algs = self.algs while any([self.PosNotExistNumber(i) for i in algs]): for i in algs: while self.PosNotExistNumber(i): self.SetPosByCMD(i) self.start += 1 self.matrix[self.pos[0]][self.pos[1]] = self.start if __name__ == '__main__': m = RotateMatrix(10,15,['LEFT','DOWN','RIGHT','UP']) m.begin(3,(6,7)) m.main() print m.disp() print m.begin(9,(7,7)) m.main() print m.disp() |
|
返回顶楼 | |
发表时间:2011-05-04
liuyfly 写道 mfkvfn 写道 最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。
赞~~~ ![]() ![]() ![]() 赞个P,他不写出公式光说谁不会?我说打印质数也就一个公式,你赞我不? |
|
返回顶楼 | |
发表时间:2011-05-04
|
|
返回顶楼 | |