Looping in a spiral

前端 未结 30 2734
独厮守ぢ
独厮守ぢ 2020-11-22 15:07

A friend was in need of an algorithm that would let him loop through the elements of an NxM matrix (N and M are odd). I came up with a solution, but I wanted to see if my fe

30条回答
  •  爱一瞬间的悲伤
    2020-11-22 15:37

    C# version, handles non-square sizes as well.

    private static Point[] TraverseSpiral(int width, int height) {
        int numElements = width * height + 1;
        Point[] points = new Point[numElements];
    
        int x = 0;
        int y = 0;
        int dx = 1;
        int dy = 0;
        int xLimit = width - 0;
        int yLimit = height - 1;
        int counter = 0;
    
        int currentLength = 1;
        while (counter < numElements) {
            points[counter] = new Point(x, y);
    
            x += dx;
            y += dy;
    
            currentLength++;
            if (dx > 0) {
                if (currentLength >= xLimit) {
                    dx = 0;
                    dy = 1;
                    xLimit--;
                    currentLength = 0;
                }
            } else if (dy > 0) {
                if (currentLength >= yLimit) {
                    dx = -1;
                    dy = 0;
                    yLimit--;
                    currentLength = 0;
                }
            } else if (dx < 0) {
                if (currentLength >= xLimit) {
                    dx = 0;
                    dy = -1;
                    xLimit--;
                    currentLength = 0;
                }
            } else if (dy < 0) {
                if (currentLength >= yLimit) {
                    dx = 1;
                    dy = 0;
                    yLimit--;
                    currentLength = 0;
                }
            }
    
            counter++;
        }
    
        Array.Reverse(points);
        return points;
    }
    

提交回复
热议问题