Matrix arrangement issues in php Matrix arrangement issues in php php php

Matrix arrangement issues in php


[EDIT: Update] If language doesn't matter:

Go to: http://rosettacode.org/wiki/Spiral_matrix


In PHP:

Here you go:

<?phpfunction getSpiralArray($n){    $pos = 0;    $count = $n;    $value = -$n;    $sum = -1;    do    {        $value = -1 * $value / $n;        for ($i = 0; $i < $count; $i++)        {            $sum += $value;            $result[$sum / $n][$sum % $n] = $pos++;        }        $value *= $n;        $count--;        for ($i = 0; $i < $count; $i++)        {            $sum += $value;            $result[$sum / $n][$sum % $n] = $pos++;        }    } while ($count > 0);    return $result;}function PrintArray($array){    for ($i = 0; $i < count($array); $i++) {        for ($j = 0; $j < count($array); $j++) {            echo str_pad($array[$i][$j],3,' ');        }        echo '<br/>';    }}$arr = getSpiralArray(4);echo '<pre>';PrintArray($arr);echo '</pre>';?>


In python:

from numpy import *def spiral(N):    A = zeros((N,N), dtype='int')    vx, vy = 0, 1 # current direction    x, y = 0, -1 # current position    c = 1    Z = [N] # Z will contain the number of steps forward before changing direction    for i in range(N-1, 0, -1):        Z += [i, i]    for i in range(len(Z)):        for j in range(Z[i]):            x += vx            y += vy            A[x, y] = c            c += 1        vx, vy = vy, -vx    return Aprint spiral(4)  


Looks like the snake game might work. Track a direction vector, and turn right 90 degrees every time you hit a side or a populated square. The tail keeps extending indefinitely :)

Edit : Snakey v0.1 in C#. Works for non square grids too ;)

using System;using System.Text;namespace ConsoleApplication1{    class Program    {        public enum Direction        {            Up,            Down,            Left,            Right        }        static void Main(string[] args)        {            int[,] maze;            Direction currentDirection = Direction.Right;            bool totallyStuck = false;            bool complete = false;            int currentX = 0;            int currentY = 0;            int boundX = 4;            int boundY = 5;            int currentNumber = 1;            int stuckCounter = 0;            bool placeNumber = true;            maze = new int[boundY, boundX];            while ((!totallyStuck) && (!complete))            {                if (placeNumber)                {                    maze[currentY, currentX] = currentNumber;                    currentNumber++;                    stuckCounter = 0;                }                switch (currentDirection)                {                    case Direction.Right:                        // Noted short Circuit Bool Evan                        if ((currentX + 1 < boundX) && (maze[currentY, currentX + 1] == 0))                        {                            placeNumber = true;                            currentX++;                            stuckCounter = 0;                        }                        else                        {                            placeNumber = false;                            stuckCounter++;                        }                        break;                    case Direction.Left:                        if ((currentX - 1 >= 0) && (maze[currentY, currentX - 1] == 0))                        {                            placeNumber = true;                            currentX--;                            stuckCounter = 0;                        }                        else                        {                            placeNumber = false;                            stuckCounter++;                        }                        break;                    case Direction.Down:                        if ((currentY + 1 < boundY) && (maze[currentY + 1, currentX] == 0))                        {                            placeNumber = true;                            currentY++;                            stuckCounter = 0;                        }                        else                        {                            placeNumber = false;                            stuckCounter++;                        }                        break;                    case Direction.Up:                        if ((currentY - 1 >= 0) && (maze[currentY - 1, currentX] == 0))                        {                            placeNumber = true;                            currentY--;                            stuckCounter = 0;                        }                        else                        {                            placeNumber = false;                            stuckCounter++;                        }                        break;                }                // Is Snake stuck? If so, rotate 90 degs right                if (stuckCounter == 1)                {                    switch (currentDirection)                    {                        case Direction.Right:                            currentDirection = Direction.Down;                            break;                        case Direction.Down:                            currentDirection = Direction.Left;                            break;                        case Direction.Left:                            currentDirection = Direction.Up;                            break;                        case Direction.Up:                            currentDirection = Direction.Right;                            break;                    }                }                else if (stuckCounter > 1)                {                    totallyStuck = true;                }            }            // Draw final maze            for (int y = 0; y < boundY; y++)            {                for (int x = 0; x < boundX; x++)                {                    Console.Write(string.Format("{0:00} ",maze[y, x]));                }                Console.Write("\r\n");            }        }    }}