-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathd03_2.php
78 lines (55 loc) · 2 KB
/
d03_2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
function get_adjacent_values($matrix, $x, $y)
{
$sum = 0;
$sum += isset($matrix[$x-1][$y-1]) ? $matrix[$x-1][$y-1] : 0;
$sum += isset($matrix[$x-1][$y]) ? $matrix[$x-1][$y] : 0;
$sum += isset($matrix[$x-1][$y+1]) ? $matrix[$x-1][$y+1] : 0;
$sum += isset($matrix[$x][$y-1]) ? $matrix[$x][$y-1] : 0;
$sum += isset($matrix[$x][$y+1]) ? $matrix[$x][$y+1] : 0;
$sum += isset($matrix[$x+1][$y-1]) ? $matrix[$x+1][$y-1] : 0;
$sum += isset($matrix[$x+1][$y]) ? $matrix[$x+1][$y] : 0;
$sum += isset($matrix[$x+1][$y+1]) ? $matrix[$x+1][$y+1] : 0;
return $sum;
}
function travel_sprial_matrix(int $size, int $dest_number)
{
// We need odd size
if ($size % 2 === 0) $size += 1;
$matrix = [];
$center = intval(floor($size / 2));
$x = $y = $center;
$next_num = 1;
// Start at matrix's center
$matrix[$x][$y] = $next_num++;
$step_right_up = 1;
while (1) {
$step_left_down = $step_right_up + 1;
// Go right
for ($i = 1; $i <= $step_right_up; $i++) {
$y += 1;
$matrix[$x][$y] = get_adjacent_values($matrix, $x, $y);
if ($matrix[$x][$y] > $dest_number) return $matrix[$x][$y];
}
// Go up
for ($i = 1; $i <= $step_right_up; $i++) {
$x -= 1;
$matrix[$x][$y] = get_adjacent_values($matrix, $x, $y);
if ($matrix[$x][$y] > $dest_number) return $matrix[$x][$y];
}
// Go left
for ($i = 1; $i <= $step_left_down; $i++) {
$y -= 1;
$matrix[$x][$y] = get_adjacent_values($matrix, $x, $y);
if ($matrix[$x][$y] > $dest_number) return $matrix[$x][$y];
}
// Go down
for ($i = 1; $i <= $step_left_down; $i++) {
$x += 1;
$matrix[$x][$y] = get_adjacent_values($matrix, $x, $y);
if ($matrix[$x][$y] > $dest_number) return $matrix[$x][$y];
}
$step_right_up += 2;
}
}
var_dump(travel_sprial_matrix(1000, 361527));