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"); } } }}