论坛首页 综合技术论坛

关于螺旋矩阵问题的新思路

浏览 17374 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-03  
mfkvfn 写道
最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。

我试过,没有成功,很期待你给出f(n)。
0 请登录后投票
   发表时间: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;
	}


厄。。。 看错了  得改改
0 请登录后投票
   发表时间: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;
                }  
            }  
        }
    }
}
0 请登录后投票
   发表时间:2011-05-03  
codeincoffee 写道
mfkvfn 写道
最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。

我试过,没有成功,很期待你给出f(n)。


公式应该较复杂。
不如直接循环来得省事
0 请登录后投票
   发表时间:2011-05-04  
mfkvfn 写道
最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。

赞~~~
  
0 请登录后投票
   发表时间:2011-05-04  
mfkvfn 写道
最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。


不见得,这里的需求是全部打印,而不是得到某点的值

全部打印用公式法的话,还要考虑上如何避免重复计算,这样的话,复杂度就会增加很多的。
0 请登录后投票
   发表时间:2011-05-04  
我也实现了下,原理就是建一个一维数组,通过控制下标进行赋值。
http://zhaiyz.iteye.com/blog/1027696
0 请登录后投票
   发表时间: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()


0 请登录后投票
   发表时间:2011-05-04  
liuyfly 写道
mfkvfn 写道
最高效的办法是:直接先用数学方法总结出公式,然后直接用公式计算出任意行任意列的值。

赞~~~
  

赞个P,他不写出公式光说谁不会?我说打印质数也就一个公式,你赞我不?
0 请登录后投票
   发表时间:2011-05-04  
http://butcher.iteye.com/blog/550863
0 请登录后投票
论坛首页 综合技术版

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